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的地址的主要内容,如果未能解决你的问题,请参考以下文章