【发布时间】:2015-02-08 09:27:59
【问题描述】:
我目前正在寻找提供一些插入(insert 或 push_back)和一些删除(erase,pop_back 不够)方法的容器,并且在调用这两种方法时不会使迭代器或指针无效。
更清楚地说,我想要一组元素,我可以在其中添加一个元素(我不在乎在哪里),在哪里我可以删除任何元素(所以我在乎在哪里)。此外,我会有指向特定元素的外部指针,如果我从集合中添加或删除元素,我希望它们保持有效。
据我所知,有两个标准容器可以满足我的需求:set 和 list。但是,一般来说,我不喜欢将这样的容器用于这种简单的需求。由于 list 在内部涉及指针并且不提供对其元素的随机访问,我认为这不是一个好的选择。 set 可以随机访问其元素,但也涉及指针,并且随机访问本身并不是在恒定时间内完成的。我认为set 会是比list 更好的解决方案,但我已经考虑过别的了。
当一个元素被移除时,一个简单的向量不会试图保持元素连续呢?当移除这个容器中间的一个元素时,它的位置会是空的,并且不会发生其他任何事情。这样,没有迭代器或指针会失效。另外,添加元素时,容器会搜索空位置,如果没有空位置,则使用简单的push_back。
显然,由于push_back 可以使带有vector 的迭代器无效,我将使用deque 作为实现的基础。我还会使用某种堆栈来跟踪删除元素的孔。这样,除了满足我的不失效需求外,添加、删除和访问元素将在恒定时间内完成。
然而,仍然存在一个问题:当迭代这个容器或简单地通过索引访问一个元素时,我们需要考虑这些漏洞。这就是问题开始超越优势的地方。
因此我的问题是:您如何看待我对那个容器的想法?
更重要的是,你会用什么来解决我原来的问题,set、list 或其他什么?
此外,如果您对最后一个问题(迭代我的容器)有一个很好且干净的解决方案,请随时向我展示。
【问题讨论】:
-
"当移除这个容器中间的一个元素时,它的位置会是空的,不会发生其他事情。"请定义empty .
-
使用迭代器删除某些东西——这个迭代器肯定会失效
-
所以你想要
stable_vectorin boost这样的东西? -
@πάνταῥεῖ 我的意思是这个位置的内存仍然在容器内部(拥有),但它不包含可以访问的元素。
-
stable_vector 的工作方式如下:它有一个指向单独分配的数据节点的指针向量。除了数据元素之外,每个节点都有一个反向指针,该指针指向指向该节点的向量内的指针。迭代器指向这些节点。当一个元素被插入或删除时,它之后的节点中的所有后向指针都会被调整。我太快了,无法宣布这样的事情是不可能的;我道歉。
标签: c++ c++11 containers