对std::deque执行迭代器在容器两端插入或擦除后会失效



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

所以我的问题是,指向元素的std::deque的迭代器在末尾插入或在开头擦除后会失效吗?请注意,我所说的迭代器指向的是容器中的元素,这些元素不是容器的开头或结尾。

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

您需要为所描述的情况使用一个列表;对deque的任何插入(无论是否在末尾)都会使所有迭代器无效。来自C++14标准(23.3.3.4 deque modifiers):

在deque中间插入会使所有迭代器无效以及对deque元素的引用。插入deque使deque的所有迭代器无效,但没有效果关于引用deque元素的有效性。

擦除数据块最后一个元素的擦除操作将失效仅过去的结束迭代器和所有迭代器以及对擦除的元素。一种擦除操作,用于擦除deque而不是最后一个元素仅使擦除的元素无效。既不擦除第一个元素也不擦除最后一个元素的擦除操作deque的元素使过去的结束迭代器和所有迭代器和对deque所有元素的引用。

如果迭代器应用于集合的开始或结束,则Deque擦除不会使迭代器无效。不幸的是插入push_back,push_front。运气不好。

最新更新