在容器的两端插入或擦除后,std :: deque的迭代器是否会失效?

时间:2014-09-11 03:18:53

标签: c++ stl containers deque stdlist

我想实现一个不定时间间隔添加的样本移动窗口,我想知道是否应该使用std::forward_liststd::deque。随着时间的推移,将在容器的末尾添加新元素,并且将从容器的开头弹出已经过期的元素。现在,问题是这个容器将由多个对象共享,我需要确保迭代器在最后插入或在开头擦除后不会失效。

所以我的问题是,对于指向元素的std :: deque的迭代器在结尾处插入后是否会失效或者在开始时擦除?请注意,我正在谈论的迭代器指向容器中不是容器的开头或结尾的元素。

我的直觉告诉我,我需要用std::forward_list来实现它。如果是这样,是否有任何正文知道链表是​​否能够重用被破坏的节点,或者每次插入新元素时是否分配内存?

2 个答案:

答案 0 :(得分:1)

您需要根据您描述的情况使用列表;任何插入到双端队列中(无论是否在末尾)都会使所有迭代器无效。从C ++ 14标准(23.3.3.4 deque modirs):

  

deque中间的插入使所有迭代器无效   和对双端队列元素的引用。插入两端   deque使deque的所有迭代器无效,但没有效果   关于deque元素引用的有效性。

     

擦除deque的最后一个元素的擦除操作无效   只有过去的结束迭代器和所有迭代器和引用   擦除元素。擦除操作,擦除a的第一个元素   deque但不是最后一个元素仅使擦除的元素无效。   擦除操作既不擦除第一个元素也不擦除最后一个元素   deque的元素使得过去的迭代器和所有迭代器无效   迭代器和对deque的所有元素的引用。

答案 1 :(得分:0)

如果应用于集合的开头或结尾,

Deque erase不会使迭代器失效。 不幸的是insertions push_back, push_front。运气不好。