c++ - STL::deque 的 insert(loc, val) - 在 deque 结束时与其他位置的行为不一致?

标签 c++ insert undefined-behavior deque

使用 http://www.cppreference.com/wiki/stl/deque/insert作为引用,我在某些位置将值插入双端队列。

例如,如果双端队列 A 是:

a, b, d, e, g

使用指向 d 的迭代器,我可以:

A.insert(iter, c);    // insert val c before loc iter
//deque is now    a, b, c, d, e, g

并且 iter 仍然指向 d。但是,当 iter 指向 g 时,最后一个元素:

A.insert(iter, f);
//deque is now    a, b, c, d, e, f, g

但 iter 现在指向 f!!

我目前的解决方法是:

iter = A.insert(loc, val);  // point iterator to element that was inserted before loc
iter++;                     // point iter back to loc

我还没有再次测试过这个或任何东西,花了这么多时间追踪一个错误很烦人,只是为了发现 insert() 的不一致行为,在 STL 中,所有 地点。

为什么 insert() 在末尾的行为与在任何其他位置的行为不同?还是我做错了什么?

最佳答案

执行插入会使所有现有迭代器失效,因此您将通过重用旧迭代器获得不可预知的行为(可能是崩溃)。

您的解决方法是正确的解决方案。

编辑:关于您的第二个问题,您在 if (*iter == 'g') 之后缺少大括号。不过,以后请在新帖子中提出新问题。

关于c++ - STL::deque 的 insert(loc, val) - 在 deque 结束时与其他位置的行为不一致?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1972403/

相关文章:

c - 打印字符时会发生哪些积分提升?

c++ - OpenCV:arcLength 断言因 cv::Mat 而失败

c++ - 子类可以内联一个不在基类中内联的纯虚方法吗?

python - Mongoengine 弃用警告 : insert is deprecated

java - 在 xml 文件中插入节点

c - C 中后置和前置增量运算符的奇怪行为

c++ - 为什么删除 void* 是 UB 而不是编译错误?

c++ - 如何在 VC++ 中获取 WPF 应用程序的屏幕截图?

c++ - 为什么在 C++11 中有 && 时使用 std::move?

php - 使用 PHP “insert multiple” 同时插入所有 4 行