保证物品位置固定的容器

Container that guarantee fixed position for items

是否有 C++ 容器保证无论发生什么变化,项目都有一个固定的指针?

例如,如果发生 push_back 或擦除,std::vector 可能会更改项目的地址。所以这个改完之后item的地址就变成垃圾了。那么,有没有一种容器在容器变化时不会改变内存中的项目地址?

P.S。编译时大小或固定大小不是一个选项

编辑: 正如@Joachim Pileborg 所说,这是 XY 问题,或者实际上是 XYZ 问题! Z 是这个问题。 Y是以下一个:

原来的:

我有一组 Points(x,y) 的数据。此 Points 将进入管道。结果应该是:

我不想按值复制点和 return 它们。我知道只有 xyPoint 无需担心复制它。但是,在我看来,它是模板化问题,在某些情况下可能是更大的对象。

您可以使用 std::map 并以指针作为键,因为键是唯一的,无论您做什么更改,地址都不会改变。

例如: std::map<int*, list<int>> x;

Is there C++ container that guarantees a fixed pointer for items what ever changes happened?

如果通过 什么都 你包括擦除指向的项目,那么只有 std::array 是这样的容器,因为你不能从中删除元素。

如果你的意思是除擦除指向的项目之外的任何其他内容,那么所有基于节点的容器都具有 属性,如评论中所指出的。这样的标准容器是 std::liststd::forward_liststd::mapstd::multimapstd::setstd::multiset。从任何这些容器中擦除或修改(如果可以修改)项目不会使迭代器、指针或对元素的引用无效。

此外,如果您将指针存储在 std::vector 或其他没有 属性 的容器中,那么即使索引、指针、引用和存储指针的迭代器变得无效。 boost 中有一个 stable_vector 模板,它存储指向元素的指针,并且在修改容器时不会使迭代器或指向元素的指针失效。如果元素被删除,索引当然会变得无效,显然它没有连续内存的优势。

关于你原来的问题:

鉴于您的要求,将一组 iterators/pointers 返回到原始容器似乎确实合适。如果稍后修改原始容器时迭代器必须保持有效,例如通过添加更多点或删除未被任何分区引用的点,那么原始容器的类型必须确实如本页所讨论的那样。