保证物品固定位置的容器
Container that guarantee fixed position for items
是否有C++容器可以保证对发生过更改的项目有一个固定的指针?
例如,如果发生push_back或擦除,std::vector可能会更改项目的地址。因此,该项目的地址在更改后将是垃圾。那么,有没有一个容器在容器更改时不会更改内存中的项目地址?
p.S.编译时大小或固定大小不是的选项
编辑:正如@Joachim Pileborg所说,这是XY问题,或者实际上是XYZ问题!Z就是这个问题。Y如下所示:数据迭代器的保持向量
原始版本:
我有一组Points(x,y)
的数据。此Points
将进入管道。结果应该是:
Lines
集合- 每条线路的
Points
集合。。。换句话说,点集
我不想复制点并按值返回它们。我知道只有x
和y
的Point
不需要担心复制它。然而,在我的工作中,它是模板化的问题,在某些情况下可能是更大的对象。
有没有C++容器可以保证对发生过更改的项目有一个固定的指针?
如果whatever你包括擦除指向的项目,那么只有std::array
是这样的容器,因为你不能从中删除元素。
如果您的意思是除擦除指向的项之外的任何其他内容,那么所有基于节点的容器都具有该属性,如注释中所指出的。这些标准容器是std::list
、std::forward_list
、std::map
、std::multimap
、std::set
和std::multiset
。从这些容器中删除或修改(如果可以修改的话)一个项不会使迭代器、指针或对元素的引用无效。
此外,如果将指针存储在std::vector
或其他没有该属性的容器中,则即使存储的指针的索引、指针、引用和迭代器变为无效,存储的指向对象的指针仍然有效。boost中有一个stable_vector
模板,它存储指向元素的指针,并且在修改容器时不会使迭代器或指向元素的指示器无效。如果元素被删除,索引当然会变得无效,而且显然它没有连续内存的优势。
关于你最初的问题:
考虑到您的需求,向原始容器返回一组迭代器/指针似乎确实很合适。如果迭代器在以后修改原始容器时必须保持有效,比如通过添加更多的点或删除任何分区都没有引用的点,那么原始容器的类型必须与本页讨论的类型相同。
您可以使用以指针为键的std::map
,因为键是唯一的,所以无论您做什么更改,地址都不会更改。
例如:std::map<int*, list<int>> x;
- 将值指定给向量(2D)的向量中的某个位置
- 使用Unreal C++获取VR耳机的世界位置/方向
- 写入位置0x0000000C时发生访问冲突
- 如何将两个不同矢量的同一位置的两个元素组合在一起
- GL_SHADERSTORAGE_BUFFER位置是否与其他着色器位置冲突
- 如何使用cudaMallocManaged在指针位置初始化对象?(C++)
- 无法获取webot::PositionSensor对象中位置传感器的值
- 非常量变量只读位置的赋值
- 如何定义更改car类中car位置的方法
- 使用迭代器时如何访问对象在向量中的位置?
- 更改.cpp程序的输入文件中数据的位置会意外更改输出
- 求最大元素位置的分治算法
- 你好。。。id_public变量不应该给出结果为 81 和 86 吗?为什么它为两个派生类占用不同的内存位置?
- 是与初始类同一内存位置的重新定位类
- 如何在使用网格布局时重叠qwidgets,并将重叠的widget定位在距离窗口边界特定距离的位置
- 我不知道如何定位最高随机数的位置
- 如何在MFC上设置窗口位置以将其定位到屏幕顶部
- 将QGraphicsSvgItem的中心定位在一个位置上。
- 如何定位WinRT异步方法调用中出现错误的位置
- 重定位表项在平面二进制文件中的存储位置