注意:这不是我应该“使用列表还是双端队列”的问题。这是一个关于迭代器有效性的问题insert()
。
这可能是一个简单的问题,我太密集了,看不到正确的方法。我正在将网络流量缓冲区(无论好坏)实现为 a std::list<char> buf
,并且我将当前的读取位置保持为 iterator readpos
。
当我添加数据时,我会做类似的事情
buf.insert(buf.end(), newdata.begin(), newdata.end());
我现在的问题是,如何保持readpos
迭代器有效?如果它指向buf
旧readpos == buf.end()
. 插入后,我希望readpos
始终指向下一个未读字符,在插入的情况下应该是第一个插入的字符。
有什么建议么?(没有将缓冲区更改为 a std::deque<char>
,这似乎更适合该任务,如下所示。)
更新:从 GCC4.4 的快速测试中,我观察到 deque 和 list 的行为不同readpos = buf.end()
:在末尾插入后,readpos 在列表中被破坏,但指向 deque 中的下一个元素。这是标准保证吗?
(根据cplusplus,任何 deque::insert()都会使所有迭代器失效。这不好。也许使用计数器比迭代器更好地跟踪双端队列中的位置?)