c – 通过插入保持std :: list迭代器有效

注意:这不是我应该“使用list还是deque”的问题.这是一个关于insert()面对迭代器有效性的问题.

这可能是一个简单的问题,我只是太密集了,看不到正确的方法来做到这一点.我正在实现(无论好坏)网络流量缓冲区作为std :: list< char> buf,我将当前的读取位置保持为迭代器readpos.

当我添加数据时,我会做类似的事情

buf.insert(buf.end(),newdata.begin(),newdata.end());

我现在的问题是,如何保持readpos迭代器有效?如果它指向旧buf的中间,那么它应该没问题(通过std :: list的迭代器保证),但通常我可能已经读取并处理了所有数据,并且我有readpos == buf.end().在插入之后,我希望readpos总是指向下一个未读的字符,在插入的情况下应该是第一个插入的字符.

有什么建议? (没有将缓冲区更改为std :: deque< char>,这似乎更适合任务,如下所示.)

更新:从使用GCC4.4的快速测试中我发现deque和list在readpos = buf.end()方面表现不同:在最后插入后,readpos在列表中被破坏,但指向下一个元素双端队列.这是标准保证吗?

(根据cplusplus,任何deque :: insert()都会使所有迭代器失效.这没有用.也许使用计数器比迭代器更好地跟踪双端队列中的位置?)

解决方法

if (readpos == buf.begin())
{
    buf.insert(buf.end(),newdata.end());
    readpos = buf.begin();
}
else
{
    --readpos;
    buf.insert(buf.end(),newdata.end());
    ++readpos;
}

不优雅,但它应该工作.

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...