我需要对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);
我的问题是,如何在不出现内存错误的情况下多次使用我的代码?第二个代码是否应该阻止我的代码导致内存错误?
答案 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
可以免除内存错误。