保证物品位置固定的容器
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
将进入管道。结果应该是:
- 一组
Lines
- 一组
Points
每行...换句话说,一组点
我不想按值复制点和 return 它们。我知道只有 x
和 y
的 Point
无需担心复制它。但是,在我看来,它是模板化问题,在某些情况下可能是更大的对象。
您可以使用 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::list
、std::forward_list
、std::map
、std::multimap
、std::set
和 std::multiset
。从任何这些容器中擦除或修改(如果可以修改)项目不会使迭代器、指针或对元素的引用无效。
此外,如果您将指针存储在 std::vector
或其他没有 属性 的容器中,那么即使索引、指针、引用和存储指针的迭代器变得无效。 boost 中有一个 stable_vector
模板,它存储指向元素的指针,并且在修改容器时不会使迭代器或指向元素的指针失效。如果元素被删除,索引当然会变得无效,显然它没有连续内存的优势。
关于你原来的问题:
鉴于您的要求,将一组 iterators/pointers 返回到原始容器似乎确实合适。如果稍后修改原始容器时迭代器必须保持有效,例如通过添加更多点或删除未被任何分区引用的点,那么原始容器的类型必须确实如本页所讨论的那样。
是否有 C++ 容器保证无论发生什么变化,项目都有一个固定的指针?
例如,如果发生 push_back 或擦除,std::vector 可能会更改项目的地址。所以这个改完之后item的地址就变成垃圾了。那么,有没有一种容器在容器变化时不会改变内存中的项目地址?
P.S。编译时大小或固定大小不是一个选项
编辑:
正如@Joachim Pileborg 所说,这是 XY 问题,或者实际上是 XYZ 问题! Z 是这个问题。 Y是以下一个:
原来的:
我有一组 Points(x,y)
的数据。此 Points
将进入管道。结果应该是:
- 一组
Lines
- 一组
Points
每行...换句话说,一组点
我不想按值复制点和 return 它们。我知道只有 x
和 y
的 Point
无需担心复制它。但是,在我看来,它是模板化问题,在某些情况下可能是更大的对象。
您可以使用 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::list
、std::forward_list
、std::map
、std::multimap
、std::set
和 std::multiset
。从任何这些容器中擦除或修改(如果可以修改)项目不会使迭代器、指针或对元素的引用无效。
此外,如果您将指针存储在 std::vector
或其他没有 属性 的容器中,那么即使索引、指针、引用和存储指针的迭代器变得无效。 boost 中有一个 stable_vector
模板,它存储指向元素的指针,并且在修改容器时不会使迭代器或指向元素的指针失效。如果元素被删除,索引当然会变得无效,显然它没有连续内存的优势。
关于你原来的问题:
鉴于您的要求,将一组 iterators/pointers 返回到原始容器似乎确实合适。如果稍后修改原始容器时迭代器必须保持有效,例如通过添加更多点或删除未被任何分区引用的点,那么原始容器的类型必须确实如本页所讨论的那样。