求助看个问题

j8daxue 2012-04-11 05:00:27
struct Maixu
{
int sid; //id
std::list<int> userlist: //队列
int validTime; //预定时间,每个结构不一样,平均5分钟左右,以秒为单位
int leftTime; //剩余时间,以秒为单位
};

其中队列userlist中每一项都在预定的时间validTime后出队,比如当前队列是{1,2,3},validTime是5秒,则5秒后1出列,队列变为{2,3},再过5秒2出队,队列变为{3},相应的实现代码如下:

std::vector<Maixu> m_maixus; /*这个vector长度最多可以达到100000*/

void Timer() //Timer函数每秒运行一次
{
for(std::vector<Maixu>::iterator it = m_maixus.begin();
it !=m_maixus.end();++it)
{
if(it->userlist.empty())
continue;
if(--it->leftTime == 0)
{
//时间到
it->userlist.pop_front();
it->leftTime = it->validTime;
//其他操作
}
}
}

请问上面的实现方式有没有什么问题?如何改进?请提出你的改进方案并重写上面的代码段。
...全文
302 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
j8daxue 2012-04-12
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 的回复:]

引用 15 楼 的回复:

没太看明白意思,是说有些元素timeout了,并且list为空了,那么就依次放在最后、次后..
一旦循环看到timeout为0,list空的就break省点时间?

一个轮询过程,list应该会再修改,而不是一开始就固定了的。

PS.多玩YY怎么进啊,投过几次简历理都不理,是不是学历要求很高?

是说,将list 为空的 和list 不为空的分成……
[/Quote]
怎么知道vector的那个项被激活?不过方法倒是很可取,轮询不用做那么多次了。
另外多谢了,我有几个同学在里面,想网投试试,没想投了2次结果都没有。
j8daxue 2012-04-12
  • 打赏
  • 举报
回复
算了,不讨论也罢。那份题目个人觉得出的非常无聊,出题的像是专喜欢拿一些很诡异,偏门完全不实用的东西来考,像成员初始化列表顺序(当很多人没看过c++ prime么?),构造赋值/拷贝构造,不用虚析构等。

除了这题看到没什么想法,所以才拿出来问问。
iamnobody 2012-04-12
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 的回复:]

没太看明白意思,是说有些元素timeout了,并且list为空了,那么就依次放在最后、次后..
一旦循环看到timeout为0,list空的就break省点时间?

一个轮询过程,list应该会再修改,而不是一开始就固定了的。

PS.多玩YY怎么进啊,投过几次简历理都不理,是不是学历要求很高?
[/Quote]
是说,将list 为空的 和list 不为空的分成左右两个部分,记录分隔点.
循环时只对不为空的访问.

如果有一个被激活,或者有一个空了,稍作调整.
\

理论上说笔试机会很容易得到呀...

http://hr.yy.com/

这里面写了要求.

要是不能笔试可以发简历给我推荐.

j8daxue 2012-04-12
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 的回复:]

引用 14 楼 的回复:

引用 10 楼 的回复:

没人见过这题吗...


见过..多玩yy的笔试,,
不知道官方答案.

我当时的答案是:

每次循环都要对timeout 的Maixu 进行判断,这是不必要的.
应该每次time out 时就把Maixu 移到list 的结尾(用一个swap 操作和最后一个元素交换).
循环时不再判断time out 了的……
[/Quote]
windows下的定时器会放在消息队列里,上一个timer没处理完,这个函数不会重入。——那么是考虑并不是那么实时(每隔1s)的问题?

除非是说外部修改,如果加锁了,同样也是上面的问题。
ghlhy0505 2012-04-12
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 的回复:]

引用 10 楼 的回复:

没人见过这题吗...


见过..多玩yy的笔试,,
不知道官方答案.

我当时的答案是:

每次循环都要对timeout 的Maixu 进行判断,这是不必要的.
应该每次time out 时就把Maixu 移到list 的结尾(用一个swap 操作和最后一个元素交换).
循环时不再判断time out 了的.
[/Quote]
每次timeout之后不是立即重新对lefttime赋值了吗,说明他还要在接着计算timeout,还要继续将list中的数据做出队操作啊,如果list中的数据空了,我觉得倒是可以把他从vector中移除去,

另外我觉得每秒调用一次timer函数,所以对vector的操作中一定要考虑同步问题啊,我还没想出来这个同步怎么控制好
it->leftTime = it->validTime
j8daxue 2012-04-12
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 的回复:]

引用 10 楼 的回复:

没人见过这题吗...


见过..多玩yy的笔试,,
不知道官方答案.

我当时的答案是:

每次循环都要对timeout 的Maixu 进行判断,这是不必要的.
应该每次time out 时就把Maixu 移到list 的结尾(用一个swap 操作和最后一个元素交换).
循环时不再判断time out 了的.
[/Quote]
没太看明白意思,是说有些元素timeout了,并且list为空了,那么就依次放在最后、次后..
一旦循环看到timeout为0,list空的就break省点时间?

一个轮询过程,list应该会再修改,而不是一开始就固定了的。

PS.多玩YY怎么进啊,投过几次简历理都不理,是不是学历要求很高?
iamnobody 2012-04-12
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 的回复:]

没人见过这题吗...
[/Quote]

见过..多玩yy的笔试,,
不知道官方答案.

我当时的答案是:

每次循环都要对timeout 的Maixu 进行判断,这是不必要的.
应该每次time out 时就把Maixu 移到list 的结尾(用一个swap 操作和最后一个元素交换).
循环时不再判断time out 了的.
ghlhy0505 2012-04-12
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 的回复:]

if(it->userlist.empty())
continue;
队列为空应直接结束吧,为什么还要继续循环呢
[/Quote]

这个只是当前那个list为空了,肯定还要继续循环去取vector中的下一个list啊
j8daxue 2012-04-12
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 的回复:]

if(it->userlist.empty())
continue;
队列为空应直接结束吧,为什么还要继续循环呢
[/Quote]
广州信息港某家的笔试题。

某个为空不代表全部为空,另外list也许在外面可以加进去。
zyrr159487 2012-04-12
  • 打赏
  • 举报
回复
if(it->userlist.empty())
continue;
队列为空应直接结束吧,为什么还要继续循环呢
j8daxue 2012-04-12
  • 打赏
  • 举报
回复
没人见过这题吗...
nice_cxf 2012-04-11
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]

其中队列userlist中每一项都在预定的时间validTime后出队,比如当前队列是{1,2,3},validTime是5秒,则5秒后1出列,队列变为{2,3},再过5秒2出队,队列变为{3}


这个过程,是那段代码在跑,你提供的代码,没有处理上述出队的操作。

只有 时间到了 的一段代码处理。
[/Quote]
pop_front不就是出队么?
j8daxue 2012-04-11
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]

其中队列userlist中每一项都在预定的时间validTime后出队,比如当前队列是{1,2,3},validTime是5秒,则5秒后1出列,队列变为{2,3},再过5秒2出队,队列变为{3}


这个过程,是那段代码在跑,你提供的代码,没有处理上述出队的操作。

只有 时间到了 的一段代码处理。
[/Quote]
是啊,要求就是时间到了才出队,没到就不处理了。

[Quote=引用 6 楼 的回复:]

看错了,POP的是队列不是vector,似乎没什么问题,不过Timer会重入么?如果有可能的话,要加锁
[/Quote]
面试题,我也不清楚,不过windows环境定时器会阻塞,难道是想说不是那么精确?
hen_hao_ji 2012-04-11
  • 打赏
  • 举报
回复
其中队列userlist中每一项都在预定的时间validTime后出队,比如当前队列是{1,2,3},validTime是5秒,则5秒后1出列,队列变为{2,3},再过5秒2出队,队列变为{3}


这个过程,是那段代码在跑,你提供的代码,没有处理上述出队的操作。

只有 时间到了 的一段代码处理。
nice_cxf 2012-04-11
  • 打赏
  • 举报
回复
看错了,POP的是队列不是vector,似乎没什么问题,不过Timer会重入么?如果有可能的话,要加锁
j8daxue 2012-04-11
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

pop_front之后迭代器失效了把,要重新赋值
[/Quote]
这个和迭代器有什么关系?
j8daxue 2012-04-11
  • 打赏
  • 举报
回复

[Quote=引用 1 楼 的回复:]
if(--it->leftTime == 0)
{
//时间到
it->userlist.pop_front();
it->leftTime = it->validTime;
//其他操作
}
这里只对时间到了做了处理,如果时间还没到,出队伍操作没有啊
[/Quote]
没看懂什么意思。

[Quote=引用 2 楼 的回复:]

建议把代码实现目的写出来,这样会更加明了
[/Quote]
就这些代码,是面试题
nice_cxf 2012-04-11
  • 打赏
  • 举报
回复
pop_front之后迭代器失效了把,要重新赋值

菜味辣鸡 2012-04-11
  • 打赏
  • 举报
回复
建议把代码实现目的写出来,这样会更加明了
hen_hao_ji 2012-04-11
  • 打赏
  • 举报
回复

if(--it->leftTime == 0)
{
//时间到
it->userlist.pop_front();
it->leftTime = it->validTime;
//其他操作
}
这里只对时间到了做了处理,如果时间还没到,出队伍操作没有啊

64,683

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧