C++ 不使迭代器(和指针)无效的容器

C++ 不使迭代器(和指针)无效的容器,c++,c++11,containers,C++,C++11,Containers,我目前正在寻找一个容器,它提供了一些插入插入或推回以及一些删除擦除,而推回是不够的方法,并且在调用这两个方法时不会使迭代器或指针无效 更清楚地说,我想要一组元素,我可以在其中添加一个我不在乎在哪里的元素,我可以在哪里删除任何元素,所以我在乎在哪里。此外,我会有指向特定元素的外部指针,如果我在集合中添加或删除元素,我希望它们保持有效 据我所知,有两个标准容器可以满足我的需要:set和list。不过,一般来说,我不喜欢用这些容器来满足如此简单的需要。由于列表在内部包含指针,并且不提供对其元素的随机访

我目前正在寻找一个容器,它提供了一些插入插入或推回以及一些删除擦除,而推回是不够的方法,并且在调用这两个方法时不会使迭代器或指针无效

更清楚地说,我想要一组元素,我可以在其中添加一个我不在乎在哪里的元素,我可以在哪里删除任何元素,所以我在乎在哪里。此外,我会有指向特定元素的外部指针,如果我在集合中添加或删除元素,我希望它们保持有效

据我所知,有两个标准容器可以满足我的需要:set和list。不过,一般来说,我不喜欢用这些容器来满足如此简单的需要。由于列表在内部包含指针,并且不提供对其元素的随机访问,因此我认为这不是一个好的选择。集合可以随机访问其元素,但也涉及指针,并且随机访问本身不是在固定时间内完成的。我认为集合比列表是更好的解决方案,但我考虑了其他一些问题

如果一个简单的向量在删除元素时不试图保持元素的连续性呢?当移除容器中间的一个元素时,它的位置将是空的,不会有其他的事情发生。这样,就不会使迭代器或指针无效。此外,在添加元素时,容器将搜索一个空位置,如果没有这样的孔,则使用简单的推回

显然,由于push_back可以使用向量使迭代器无效,因此我将使用deque作为实现的基础。我还将使用某种堆栈来跟踪移除元素的孔。这样,除了满足我的无失效需求之外,添加、删除和访问元素将在固定时间内完成

然而,仍然存在一个问题:当在这个容器上进行迭代或仅仅通过索引访问元素时,我们需要考虑漏洞。这就是问题开始超越优势的地方

因此我的问题是:你认为我对那个容器的想法如何? 更重要的是,你会用什么来解决我的原始问题,一个集合,一个列表或其他什么? 另外,如果您对在我的容器上迭代的最后一个问题有一个好的、干净的解决方案,请随时向我展示。

要求1:插入insert或push back并删除一些擦除,而不仅仅是最后一个元素

符合条件的候选项:deque、forward_list、list、map、multi_map、set、multiset、unordered_map、unordered_multimap、unordered_set、unordered_multiset和vector

排除的候选项:数组无插入或推回、队列、优先级队列和堆栈无擦除,仅弹出

要求2:在调用这两个方法时不会使迭代器或指针无效

符合要求的候选人也满足要求1:转发列表、列表、映射、多映射、集合、多集、, 擦除时消除:deque迭代器仅在擦除第一个元素时保持有效,并在擦除开始后对所有元素进行矢量化 插入时消除:在大多数情况下,无序_映射、无序_多重映射、无序_集和无序_多重集(如果增长需要重新灰化)和向量(如果增长需要重新分配)都会出列 要求3:外部指针应保持有效

与要求2的结果几乎相同。然而,无序映射、无序多重映射、无序集合和无序多重集合将满足这一要求,因为对元素的引用仍然有效

要求4:对元件的随机访问

符合要求1和2的候选人:map和multimap 几乎一致的候选者:set和multiset没有随机访问,但可以使用成员find-Ologn来满足它 不符合:列表虽然算法查找可以在上提供一个解决方法。 问题1的答案:哪一个更好,集合还是列表

这取决于你的其他要求。在一个集合中,每个值只能存储一次。如果元素都是唯一的,请选择集合。如果不是,你最好选择列表或多集

我不知道您存储的元素,但是整个元素是搜索参数吗?还是有钥匙?在后一种情况下,你真的需要一张地图

问题2的答案:替代容器如何

我不会选择deque作为你的替代品

如果您可以预见元素的最大数量,那么您可以简单地保留足够的容量以避免重新分配。满足要求1、3和4。 若您有一个空元素来表示孔,那个么您也可以满足需求2。在最坏的情况下,你们可以选择一个向量来表示你们的元素,若它是有效的,你们可以选择一个指示符

如果这样一个最大值是不确定的,我宁愿选择一张证明是灵活的并且满足您所有要求的地图
新界南部