我有带有侵入式列表钩子的对象。我想通过将它们保存在std集合中来管理内存。然后我使用侵入式集合对对象执行操作(排序等等)。
intrusive::list<MyObject> intrusiveList;
vector<MyObject> stdVector;
stdVector.push_back(MyObject());
intrusiveList.push_back(stdVector.front());
向量不是一个好的选择(除非你可以预先调整大小),因为它可能会将对象复制到不同的内存,从而使任何侵入式钩子无效。 deque怎么样? 对于那些不熟悉boost :: intrusive的人来说,这个问题真的归结为: deque可以将对象重新复制到不同的内存中,还是保证在双端队列的生命周期内保持相同的内存?我知道有一些关于back()和front()的保证,但它并不能保证所有的迭代器永远不会失效,所以我有点困惑。
答案 0 :(得分:0)
如果在双端队列中间插入或删除,则双端队列只会复制对象。您可以在两端添加或删除,而无需移动任何对象。
相信虽然迭代器可能会失效,即使每个成员的地址保持不变。 deque具有两级结构,并且可能会重新分配一些内部数据,使迭代器无效到deque中。
更确切地说:
deque中间的插入使所有迭代器和对deque元素的引用无效。在deque两端的插入使deque的所有迭代器无效,但对deque元素的引用的有效性没有影响。