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++处理向量和迭代器。在上面的代码中,为什么 "abc行 "打印的是0,不是应该打印99吗?当我使用for循环打印所有向量元素时,也打印了99,但为什么abc行没有这样做?我是在dereferencing迭代器*it,我希望它能容纳99这个元素。
在向量中插入时,之前的所有迭代器都无效。之后的所有 veclist.insert(it,20)
是未定义的行为。
更准确的说,第一条打印能正常工作,而第二条打印不能正常工作的原因是由于分配的 std::vector
能力。大多数实施方案都会分配 只有2^N的记忆力 分块。
因此,初始向量有 能力 当你把大小从3增加到4时,所有之前的迭代器恰好仍然有效。但是,当大小从4增长到8时,内存会被复制到一个新的区域,因此你要访问被删除的内存。
为了解决这个问题,你可以简单的使用 std::vector::insert
作为 有效 迭代器指向插入的元素。
例如
it = veclist.insert(it,20);
因为 std::vector<T,Allocator>::insert
导致迭代器无效。
如果新的
size()
胜过旧的capacity()
. 如果新的size()
大于capacity()
,所有的迭代和引用都无效。否则,只有插入点之前的迭代和引用仍然有效。过去结束的迭代器也是无效的。
这意味着在 insert
'的调用。it
已经失效。它的用法像 *it
或 it++
导致UB。
你应该指定 it
的返回值。insert
,这是指向插入值的迭代器,例如
vector<int>::iterator it;
it=veclist.begin();
it=veclist.insert(it,20);
cout << *it << endl; // prints 20
it++;
it=veclist.insert(it,99);
cout << *it <<endl; // prints 99