gpt4 book ai didi

C++ rbegin 修改reverse_iterator的地址

转载 作者:太空宇宙 更新时间:2023-11-04 11:45:53 25 4
gpt4 key购买 nike

我在使用这段代码的 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() 在解锁队列后接收新元素时修改它的值。

谢谢。

最佳答案

如果您将迭代器设置为 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的地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19863109/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com