是否有 C++ 容器可以保证无论发生什么变化项目都有一个固定的指针?
例如,std::vector 可能会在发生 push_back 或 erase 时更改项目的地址。所以这个改完之后item的地址就变成垃圾了。那么,有没有一种容器在容器变化的时候不会改变内存中item的地址呢?
附言编译时大小或固定大小不是一个选项
编辑: 正如@Joachim Pileborg 所说,这是 XY 问题,或者实际上是 XYZ 问题! Z 是这个问题。 Y是以下一个: Keeping vector of iterators of the data
原来的:
我有一组 Points(x,y)
的数据。此 Points
将进入管道。结果应该是:
- 一组
行
- 每行的一组
点
...换句话说,一组点
我不想复制点并按值返回它们。我知道只有 x
和 y
的 Point
无需担心复制它。然而,在我看来,它是模板化问题,在某些情况下可能是更大的对象。
最佳答案
Is there C++ container that guarantees a fixed pointer for items what ever changes happened?
如果通过任何方式您包括删除所指向的项目,则只有 std::array
是这样的容器,因为您无法从中删除元素。
如果您的意思是除了删除指向的项目之外的任何其他内容,那么所有基于节点的容器都具有该属性,如评论中所指出的那样。此类标准容器是 std::list
、std::forward_list
、std::map
std::multimap
, std::set
和 std::multiset
。从任何这些容器中删除或修改(如果可以修改)项目不会使迭代器、指针或对元素的引用无效。
此外,如果您将指针存储在 std::vector
或其他没有该属性的容器中,那么存储的指向该对象的指针仍然有效,即使索引、指针、引用和存储指针的迭代器变得无效。 boost 中有一个 stable_vector
模板,它存储指向元素的指针,并且不会在修改容器时使迭代器或指向元素的指针失效。如果元素被删除,索引当然会变得无效,显然它没有连续内存的优势。
关于您的原始问题:
鉴于您的要求,将一组迭代器/指针返回到原始容器似乎确实合适。如果稍后修改原始容器时迭代器必须保持有效,例如通过添加更多点或删除未被任何分区引用的点,那么原始容器的类型必须确实如本页所讨论的那样。
关于c++ - 保证元素位置固定的容器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33779308/