检查此代码:
#include "stdafx.h"
#include <list>
int _tmain(int argc, _TCHAR* argv[])
{
std::list<int> mylist;
mylist.push_back(1);
std::list<int>::iterator i = mylist.end();
if( i == mylist.end() )
printf( "end is end\n" );
mylist.clear();
if( i == mylist.end() )
printf( "never get here because Microsoft seems to "
"think the iterator is no longer safe.\n" );
return 0;
}
Run Code Online (Sandbox Code Playgroud)
现在,根据cplusplus.com,这不应该是一个问题,在发布模式下,我认为这很好,并没有真正引起任何问题,但调试变得不可能,因为这只是保释而不让我继续.有什么指针吗?
注意:这不是我应该"使用list还是deque"的问题.这是一个关于迭代器在面对的有效性的问题insert().
这可能是一个简单的问题,我只是太密集了,看不到正确的方法来做到这一点.我正在实现(无论好坏)网络流量缓冲区作为a std::list<char> buf,并且我将当前的读取位置保持为迭代器readpos.
当我添加数据时,我会做类似的事情
buf.insert(buf.end(), newdata.begin(), newdata.end());
Run Code Online (Sandbox Code Playgroud)
我现在的问题是,如何保持readpos迭代器有效?如果它指向旧的中间buf,那么它应该没问题(通过std :: list的迭代器保证),但通常我可能已经读取并处理了所有数据而且我有readpos == buf.end().在插入之后,我readpos 总是希望指向下一个未读的字符,在插入的情况下应该是第一个插入的字符.
有什么建议?(没有将缓冲区更改为a std::deque<char>,这似乎更适合任务,如下所示.)
更新:从使用GCC4.4的快速测试中我发现deque和list的行为方式不同readpos = buf.end():插入结束后,readpos在列表中被破坏,但指向deque中的下一个元素.这是标准保证吗?
(根据cplusplus,任何deque :: insert()都会使所有迭代器失效.这没有用.可能使用计数器比迭代器更好地跟踪双端队列中的位置?)
请考虑以下代码:
std::set<int> s;
auto it = s.begin();
s.insert(1);
s.insert(2);
std::cout << *it << std::endl;
Run Code Online (Sandbox Code Playgroud)
输出(至少对我而言)是2.这里发生了什么事?什么it时候我取消引用它的状态?
我知道当我调用begin()一个空集时,我得到一个等价的迭代器end().我也知道调用inserta set不会使其迭代器失效.迭代器是否保持等效,end()即使我现在已经插入元素set,所以现在我得到未定义的行为?这是由标准定义的吗?