c++ - 保证元素位置固定的容器

标签 c++ c++11 containers

是否有 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 将进入管道。结果应该是:

  • 一组
  • 每行的一组...换句话说,一组点

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

最佳答案

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

如果通过任何方式您包括删除所指向的项目,则只有 std::array 是这样的容器,因为您无法从中删除元素。

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

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

关于您的原始问题:

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

关于c++ - 保证元素位置固定的容器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33779308/

相关文章:

c++ - 帮助配置log4cplus配置文件(properties文件)

c++ - QML多媒体播放文件夹中的所有mp3

c++ - 如何在解决方案资源管理器中保留源文件夹层次结构?

c++ - "Forwarding"字符串文字

c++ - 临时对象中的成员变量是否尽可能隐式 move ?

kubernetes - 多个容器 POD 中的容器进程之一崩溃会发生什么情况?

c++ - 带有特殊字符的字符串的控制台输出

c++ - 一个通用的 STLish contains()

docker - 如何通过 Dockerfile 更改 nginx 的默认主页,然后通过运行容器启动它

c++ - C++11 中的 CRTP 调度