首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C++重新开始修改reverse_iterator地址

C++重新开始修改reverse_iterator地址
EN

Stack Overflow用户
提问于 2013-11-08 15:49:09
回答 1查看 305关注 0票数 1

这段代码在c++中有一个奇怪的问题:

代码语言:javascript
运行
复制
mutex_type  list_mutex;
typedef list<char*> RQueue;
RQueue rQueue;
RQueue::reverse_iterator  rstart, rend, last;

  1  while(true) {
  2      LockMutex(list_mutex);
  3      rstart = rQueue.rbegin();
  4      rend   = rQueue.rend();
  5      while( (rstart != rend) && (rstart != last) ) {
  6           print *rstart;
  7      }
  8      last = rQueue.rbegin(); 
  9      UnlockMutex(list_mutex);
  10  }
  • rQueue是一个队列,我在该队列中按反向顺序迭代。
  • rQueue可以随时接收消息
  • 我添加了迭代器last,以避免在第6行重新处理接收消息。
  • 在第8行,我保留了打印消息的位置,我只想打印比上一条消息更新的消息。 我的问题是:当迭代完成并在队列中添加新消息时,迭代器last的值将被更改,与迭代器rstart的值相同,因此新到达的消息不会打印在第6行。

我不知道为什么last = rQueue.rbegin()在解锁队列后接收新元素时修改它的值。

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-11-08 18:01:51

如果将迭代器设置为rbegin(),它将始终指向列表的最后一个元素。如果在后面添加另一个元素,迭代器仍将指向最后一个元素(现在是新元素)。它不会改变,它只是不停地指向终点。

我做了这个测试:

代码语言:javascript
运行
复制
list<const char *> my_list;
my_list.push_back("msg 1");

list<const char*>::reverse_iterator it = my_list.rbegin();

cout << "Iterator is " << *it << endl;

my_list.push_back("msg 2");
my_list.push_back("msg 3");
my_list.push_back("msg 4");

cout << "Iterator is " << *it << endl;

这个程序给出了输出:

代码语言:javascript
运行
复制
Iterator is msg 1
Iterator is msg 4

我有另一个不使用反向迭代器的解决方案。相反,addMessage()-function将read_pos更新为最新消息。如果read_pos没有指向终点,那么它也不会被更改。这允许printMessage()打印自上次运行以来添加的所有消息。

请注意,我只测试了这个没有锁定。

代码语言:javascript
运行
复制
mutex_type  list_mutex;
typedef list<const char*> RQueue;
RQueue rQueue;

RQueue::iterator read_pos;

void addMessage(const char *message) {
    LockMutex(list_mutex);

    rQueue.push_back(message);

    if (rQueue.size() == 1) {
        read_pos = rQueue.begin();
    }
    else if (read_pos == rQueue.end()) {
        read_pos--;
    }

    UnlockMutex(list_mutex);
}

void printMessage() {
  RQueue::iterator prev_pos;

  while (true) {
    LockMutex(list_mutex);

    if (rQueue.size() == 0) {
          UnlockMutex(list_mutex);
          continue;
    }

    RQueue::iterator end = rQueue.end();
    while (read_pos != end) {
        cout << *read_pos << endl;
        read_pos++;
    }

    UnlockMutex(list_mutex);
  }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19863109

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档