C ++ rbegin修改reverse_iterator的地址

时间:2013-11-08 15:49:10

标签: c++ reverse-iterator

我在c ++中遇到一个奇怪的问题:这个代码:

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()在解锁队列后接收新元素时会修改其值。

感谢。

1 个答案:

答案 0 :(得分:0)

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

我做了这个测试:

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;

该程序提供输出:

Iterator is msg 1
Iterator is msg 4

我有另一个你可能使用的解决方案,它不使用反向迭代器。相反,addMessage() - 函数会将read_pos更新为最新消息。如果read_pos未指向结尾,则也不会更改。这允许printMessage()打印自上次运行以来添加的所有消息。

请注意,我只是在没有锁定的情况下对此进行了测试。

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);
  }
}