保证物品固定位置的容器

时间:2015-11-18 11:50:00

标签: c++ c++11 containers

是否有C ++容器可以保证项目的固定指针发生了什么变化?

例如,如果发生了push_back或erase,std :: vector可能会更改项的地址。因此,在此更改后,该项目的地址将是垃圾。那么,是否有一个容器在容器更改时不会更改内存中的项目地址?

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

修改 正如@Joachim Pileborg所述,它是XY问题,或者实际上是XYZ问题! Z就是这个问题。 Y是以下一个: Keeping vector of iterators of the data

原始的:

我的数据集Points(x,y)。这个Points将进入管道。结果应该是:

  • Lines
  • 每行Points的集合......换言之,点集的集合

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

2 个答案:

答案 0 :(得分:3)

  

是否有C ++容器可以保证项目的固定指针发生了什么变化?

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

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

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

关于您原来的问题:

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

答案 1 :(得分:0)

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

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