C++ rbegin 修改reverse_iterator的地址

Posted

技术标签:

【中文标题】C++ rbegin 修改reverse_iterator的地址【英文标题】:C++ rbegin modify address of reverse_iterator 【发布时间】:2013-11-08 15:49:09 【问题描述】:

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

谢谢。

【问题讨论】:

虽然this question 不是真正的重复,但我的回答回答了你在这里的问题。 如果删除三分之二的括号,while 语句的含义并不完全相同。 【参考方案1】:

如果将迭代器设置为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);
  

【讨论】:

以上是关于C++ rbegin 修改reverse_iterator的地址的主要内容,如果未能解决你的问题,请参考以下文章

C++初识vector

c++ string reverse 用法

Python学习iterator 迭代器小练习

map/set 迭代器不可递减是啥意思?如何使 map.rbegin()->first 工作?

标准库中 rbegin 和 end 函数的区别

C++中的向量迭代器