如果向量有足够的空间(通过保留创建),std :: vector :: insert()会使迭代器失效吗?

odi*_*erd 1 c++ iterator stl vector c++-standard-library

回答如何自我复制载体?让我对迭代器失效有点困惑.一些文献说"如果使用insert,push_back等,则认为所有迭代器都无效".多数民众赞成,它可能会导致向量增长,从而使迭代器无效.那个我知道会有足够空间的特殊情况怎么样?

第一次尝试:

myvec.reserve(myvec.size()*3);  //does this protect me from iterator invalidation?
vector<string>::iterator it = myvec.end();    
myvec.insert(myvec.end(), myvec.begin(), it);
myvec.insert(myvec.end(), myvec.begin(), it);
Run Code Online (Sandbox Code Playgroud)

经过一些优秀的答案第二次尝试

auto size = myvec.size();
myvec.reserve(size*3);  //does this protect me from iterator invalidation?  
myvec.insert(myvec.end(), myvec.begin(), myvec.begin()+size);
myvec.insert(myvec.end(), myvec.begin(), myvec.begin()+size);
Run Code Online (Sandbox Code Playgroud)

经过更优秀的答案第三次尝试:

auto size = myvec.size();
myvec.reserve(size*3);  //does this protect me from iterator invalidation?  
back_insert_iterator< vector<string> > back_it (myvec);
copy (myvec.begin(),myvec.begin()+size,back_it);
copy (myvec.begin(),myvec.begin()+size,back_it);
Run Code Online (Sandbox Code Playgroud)

Josuttis的"C++标准库参考"引用了这句话:

插入或删除元素会使引用,引用和迭代器无效,这些引用,引用和迭代器引用以下元素.如果插入导致重新分配,则会使所有引用,迭代器和指针无效.

表明我的代码是安全的和定义的行为.标准中是否有一个保证这一点的段落?

Ker*_* SB 7

过去的迭代器总是有点特殊.我小心点 标准说明了这一点(23.3.6.5):

如果没有重新分配,插入点之前的所有迭代器和引用仍然有效.

这里的关键是"插入点之前".由于您的原始文件it不在插入点之前(因为它插入点),因此我不会将其保留为有效.