C++ Vectors插入和迭代器的困惑

问题描述 投票:0回答:1
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这个元素。

c++ vector iterator dereference
1个回答
1
投票

在向量中插入时,之前的所有迭代器都无效。之后的所有 veclist.insert(it,20) 是未定义的行为。

更准确的说,第一条打印能正常工作,而第二条打印不能正常工作的原因是由于分配的 std::vector 能力。大多数实施方案都会分配 只有2^N的记忆力 分块。

因此,初始向量有 能力 当你把大小从3增加到4时,所有之前的迭代器恰好仍然有效。但是,当大小从4增长到8时,内存会被复制到一个新的区域,因此你要访问被删除的内存。

为了解决这个问题,你可以简单的使用 std::vector::insert作为 有效 迭代器指向插入的元素。

例如

it = veclist.insert(it,20);

1
投票

因为 std::vector<T,Allocator>::insert 导致迭代器无效。

如果新的 size() 胜过旧的 capacity(). 如果新的 size() 大于 capacity(),所有的迭代和引用都无效。否则,只有插入点之前的迭代和引用仍然有效。过去结束的迭代器也是无效的。

这意味着在 insert'的调用。it 已经失效。它的用法像 *itit++ 导致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
© www.soinside.com 2019 - 2024. All rights reserved.