在'插入'之后重新使用迭代器到向量

时间:2015-09-24 14:18:27

标签: c++ vector iterator

我需要对vector和iterator进行一些澄清。我有一个my_object的向量,以及该向量的迭代器。我在迭代器位置执行插入,在同一位置执行第二个插入:

myiteratornew = (my_vector).insert(myiterator, my_object1);
myiteratornew = (my_vector).insert(myiterator, my_object2);

在几种输入'上使用此功能几次后。数据,今天我收到内存错误。当然我认为问题是由修改(重新分配)向量上的迭代器引起的;现在以这种方式修改代码:

myiteratornew = (my_vector).insert(myiterator, my_object1);
myiteratornew = (my_vector).insert(myiteratornew , my_object2);

我的问题是,如何在不出现内存错误的情况下多次使用我的代码?第二个代码是否应该阻止我的代码导致内存错误?

3 个答案:

答案 0 :(得分:4)

如果将值插入向量将导致其大小变得大于其容量,则会重新分配。在这种情况下,所有迭代器和引用都将失效。

否则,只有插入点之前的迭代器和引用仍然有效。插入点之后的迭代器和引用以及past-the-end迭代器也会失效。

这很可能发生在您身上 - 您正在尝试使用不再有效的迭代器。这也是你的第二个例子按预期工作的原因 - 获得一个新的迭代器,并通过它插入是完全正确的事情。

答案 1 :(得分:0)

您应该做的是一次插入所有对象。之后迭代器无效,但是因为你已经插入了所有东西,所以你不再需要它了。它也更有效率,因为你只需要在迭代器后面移动一次而不是多次。

my_vector.insert(myiterator, begin(my_objects), end(my_objects));

如果您的对象不在容器中,您可以将它们放在那里:

my_object1;
my_object2;

std::reference_wrapper<decltype(my_object1)> myobjects[] = {my_object1, my_object2};

答案 2 :(得分:-2)

使用std::list代替std::vector可以免除内存错误。