【发布时间】:2013-01-27 01:37:46
【问题描述】:
回答How to self-copy a vector? 让我对迭代器失效感到有些困惑。一些文献说“如果您使用 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);
在一些优秀的答案后第二次尝试:
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);
经过更优秀的答案第三次尝试:
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);
这句话来自 Josuttis 的“C++ 标准库参考”:
插入或删除元素 使引用、指针和 引用以下内容的迭代器 元素。如果插入导致 重新分配,它使所有 引用、迭代器和指针。
表明我的代码是安全且已定义的行为。标准中是否有段落可以保证这一点?
【问题讨论】:
-
只为那些想要继续搜索的人:是的,某处有一段,我只是手头没有。它说的几乎和 josuttis 书完全一样。
-
我手边没有标准,但最好的事情是,cppreference.com 指出以下关于
std::vector<T>::insert()的内容:"如果新的 size() 大于旧容量()。如果新大小()大于容量(),则所有迭代器和引用都无效。否则,只有添加元素之后的迭代器和引用无效。”我会参考标准,但与其他网站不同的是,cppreference 由按照标准生存、呼吸和死亡的贡献者维护。
标签: c++ vector stl iterator c++-standard-library