int main(){
vector<int> veclist;
veclist.push_back(90);
veclist.push_back(80);
veclist.push_back(70);
vector<int>::iterator it;
it=veclist.begin();
veclist.insert(it,20);
cout << *it << endl; // prints 20
it++;
veclist.insert(it,99);
cout << *it <<endl; // line abc : prints 0
}
嗨,我正在使用 C++ 中的 vector 和迭代器。在上面的代码中,为什么“line abc”打印0。它不应该打印99吗?当我使用 for 循环打印所有 vector 元素时,也会打印 99 但为什么 abc 行不这样做?我取消引用迭代器 *it,并且我期望它保存元素 99。
最佳答案
在 vector 中插入时,所有先前的迭代器都会失效。 veclist.insert(it,20)
之后的所有内容都是未定义的行为。
为了更准确地了解幕后发生的情况,第一个打印工作而第二个打印不工作的原因是由于分配的 std::vector 容量。大多数实现仅分配 2^N 内存 block 。
因此,初始 vector 的容量为 4。当您将大小从 3 增加到 4 时,所有先前的迭代器恰好保持有效。但是,当大小从 4 增长到 8 时,内存将被复制到新区域中,因此您正在访问已删除的内存。
要解决这个问题,您可以简单地使用 std::vector::insert
的结果作为指向插入元素的 valid 迭代器:
例如
it = veclist.insert(it,20);
关于C++ vector 插入和迭代器混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62164212/