我可以在提升侵入性列表中使用双端队列项目吗
Posted
技术标签:
【中文标题】我可以在提升侵入性列表中使用双端队列项目吗【英文标题】:Can I use deque items in a boost intrusive list 【发布时间】:2011-07-20 13:02:42 【问题描述】:我有带有侵入性列表挂钩的对象。我想通过将它们保存在 std 集合中来管理内存。然后我使用侵入式集合对对象执行操作(排序等...)。
intrusive::list<MyObject> intrusiveList;
vector<MyObject> stdVector;
stdVector.push_back(MyObject());
intrusiveList.push_back(stdVector.front());
vector 不是一个好的选择(除非您可以预先调整大小),因为它可能会将对象复制到不同的内存中,这会使任何侵入性挂钩无效。双端队列呢? 对于那些不熟悉 boost::intrusive 的人来说,这个问题真的可以归结为: 双端队列可以将一个对象重新复制到不同的内存中,还是保证在双端队列的生命周期内保持在同一个内存中?我知道关于 back() 和 front() 有一些保证,但它不能保证所有迭代器都不会失效,所以我有点困惑。
【问题讨论】:
【参考方案1】:只有在双端队列中间插入或删除时,双端队列才会复制对象。您可以在两端添加或删除,而无需移动任何对象。
相信 iterators 可能会失效,即使每个成员的地址保持不变。一个双端队列具有两级结构,一些内部数据可能会被重新分配,从而使进入双端队列的迭代器无效。
更准确地说:
双端队列中间的插入会使所有迭代器和对双端队列元素的引用无效。在双端队列的任一端插入都会使双端队列的所有迭代器无效,但不会影响对双端队列元素的引用的有效性。
【讨论】:
谢谢。我在 C++0x 工作草案 N3242 中找到了答案(但我还不允许发布我自己的问题的答案 :))23.3.3.4 deque 修饰符 ... 1 效果: 在双端队列中间的插入使所有迭代器和对双端队列元素的引用无效。在双端队列的任一端插入都会使双端队列的所有迭代器无效,但对双端队列元素引用的有效性没有影响。以上是关于我可以在提升侵入性列表中使用双端队列项目吗的主要内容,如果未能解决你的问题,请参考以下文章