我目前正在寻找提供一些插入(插入或push_back)和一些删除(擦除,pop_back是不够的)方法的容器,并且这不会使迭代器或指针无效调用这两种方法。更清楚地说,我想要一组元素,我可以添加一个元素(我不关心在哪里),以及在哪里可以删除任何元素(所以我在意在哪里)。另外,我会有指向特定元素的外部指针,并且如果我从集合中添加或删除元素,我希望它们保持有效。容器,不会使迭代器(和指针)无效
据我所知,有两个标准容器可以满足我的需求:set
和list
。但是,一般来说,我不喜欢使用这样的容器来满足这样简单的需求。由于list
在内部涉及指针,并不提供随机访问其元素,我认为这不是一个好的选择。 A set
对其元素具有随机访问权限,但也涉及指针,并且随机访问本身不是在恒定时间内完成的。我认为set
会比list
更好的解决方案,但我想过其他的东西。
那么当一个元素被删除时,一个简单的向量不会试图保持元素是连续的呢?当移除该容器中间的元素时,其位置将是空的,并且不会发生其他情况。这样,没有迭代器或指针会失效。此外,添加元素时,容器将搜索空位置,如果没有这样的空洞,则使用简单的push_back
。
很明显,因为push_back
可以使vector
无效迭代器,所以我会使用deque
作为实现的基础。我也会使用某种堆栈来跟踪删除元素的洞。通过这种方式,除了满足我的无效化需求外,还可以在一段时间内添加,删除和访问元素。
但是,仍然存在一个问题:在遍历这个容器或仅仅通过索引访问元素时,我们需要考虑这些漏洞。这就是问题开始超越优势的地方。
因此,我的问题是:你怎么看待我对这个容器的想法? 更重要的是,你会用我的原始问题,set
,list
还是其他什么? 另外,如果你对最后一个问题有很好的解决方案(遍历我的容器),请随时向我展示。
_“在拆除这个容器中间的元素,它的位置是空的,并没有什么人会发生的。” _定义_empty_请。 – 2015-02-08 09:29:59
使用迭代删除的东西 - 肯定有迭代器变为无效 – 2015-02-08 09:30:54
所以,你要像[升压'stable_vector'(http://www.boost.org/doc/libs/1_57_0/doc/html/boost/container /stable_vector.html)? – 2015-02-08 09:32:14