- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我在使用这段代码的 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/
我在使用这段代码的 C++ 中遇到了一个奇怪的问题: mutex_type list_mutex; typedef list RQueue; RQueue rQueue; RQueue::rever
我正在尝试使用排序函数对字符串进行排序:这是一个字符串:索引从零开始 "effort" 我的目标是从索引 (1 到 4)[n=1,m=4] 中按降序排序,即生成一个字符串: "erofft" 我使用函
在下图中,我正在使用相同类型的迭代器,这意味着相同的operator ++实现,因此编译器如何知道应获取下一个值还是前一个值...? 最佳答案 首先,您的图片包含错误。如您所见here, vector
下面函数中rbegin()和rend()判断输入是否回文的具体作用是什么? bool palindromeCheck(string input) { if (input == string(i
我需要从容器的开头迭代到结尾之前的一个元素。我可以在循环中放置一个 if 条件来绕过最后一个元素,但我想知道是否可以像这样编写 for 循环: for (it = C.begin(); it != C
我重构了一个使用单个元素列表的类,因此它现在使用这样的列表的列表。为了尽量减少派生类的变化,我实现了一个自定义 iterator使用 boost::iterator_facade还有一种获取 boos
运行下面的代码,我希望看到测试 1 的第 4 个值的不同地址(与值 1 和 3 不同)。这表明 rend() 与 rbegin() 相同??我也不希望循环经历第二次迭代并出现段错误。 知道我做错了什么
为什么下面的代码会崩溃? int main(int argc, const char * argv[]) { std::list aList={1,2,3,4,5}; std::list::rever
我想知道使用 rbegin() 而不是 end() - 1 对 STL 容器有什么好处。 例如,你为什么要使用这样的东西: vector v; v.push_back(999); vector::re
我有一些名为 Order 的类。由于某些原因,以下代码在使用 rbegin() 时无法编译,但它适用于 begin()。我声明迭代器的方式有问题还是我的指针引用有问题? map> m typedef
既然在 C++11 修订版中为标准包含添加了非成员 begin() 和 end() 函数,为什么会有非成员版本的 rbegin() 和 rend() 函数也没有添加?开始使用begin()和end()
这个问题已经有答案了: How to call erase with a reverse iterator (14 个回答) 已关闭 3 年前。 社区去年审查了是否重新开放此问题,并将其关闭: 原始关
下面是我的 String 类的代码。我想实现 reverse_iterator 和 rbegin() 和 rend() 方法。已粘贴分配方法的代码。 String::reverse_iterator
我正在使用 boost::tokenizer,但我意识到它不支持 rbegin() 和 rend()。我想请问如何将这两个功能添加到现有类中? 这是来自 boost 网站: #include #in
根据我发现的一些 STL 文档,在 std::list 中插入或删除元素不会使迭代器无效。这意味着它可以遍历一个列表(从 begin() 到 end()),然后使用 push_front 添加元素。
对于 std::set 和 std::map 等以对数时间查找的数据类型,实现是否需要维护开始和结束迭代器?访问 begin 和 end 是否意味着查找可能以对数时间发生? 我一直假设开始和结束总是在
我遇到了一个特殊问题,我的团队担心使用 std::chrono。 我们正在使用 MSVS-13,所以是 C++11。 我有一组对象状态存储在多映射中,以 std:chrono::millisecond
我一直在 MSVC 2013 中使用 std::rbegin 和 std::rend。当我尝试使用 GCC 4.9.1 或 clang 3.5.0 编译我的代码时,两者都告诉我“rbegin”和“re
我是一名优秀的程序员,十分优秀!