【问题标题】:Re-using iterator after 'insert' into vector在“插入”到向量后重新使用迭代器
【发布时间】:2015-12-22 04:47:25
【问题描述】:

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

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

在几种“输入”数据上多次使用此功能后,今天出现内存错误。当然我认为问题是由于在 modified(重新分配)向量上使用了 old 迭代器造成的;以这种方式修改代码现在可以工作了:

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

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

【问题讨论】:

标签: c++ vector iterator


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    使用std::list 而不是std::vector 可以让您避免出现内存错误。

    【讨论】:

    • 我不建议更换容器。只要您使用从insert() 返回的迭代器,就可以使用向量来完成此操作,因为这是一个有效的迭代器。
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2019-01-06
      • 1970-01-01
      • 2014-05-27
      • 2012-01-05
      • 1970-01-01
      • 1970-01-01
      • 2020-09-21
      • 1970-01-01
      • 2016-06-29
      相关资源
      最近更新 更多