繁体   English   中英

在“插入”向量后重用迭代器

[英]Re-using iterator after 'insert' into vector

我需要对向量和迭代器进行一些说明。 我有一个向量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);

我的问题是,怎么可能多次使用我的代码而又没有出现内存错误? 第二个代码应该防止我的代码引起内存错误吗?

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

否则,只有插入点之前的迭代器和引用保持有效。 将插入点之后的迭代器和引用,以及past-the-end迭代器失效,以及。

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

您应该做的是一次插入所有对象。 此后迭代器无效,但是由于您已经插入了所有内容,因此不再需要它。 另外,由于只需要将对象移动到迭代器后面,而无需多次移动,因此效率更高。

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};

使用std::list而不是std::vector可以使您免于获得内存错误。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM