保证物品固定位置的容器

Container that guarantee fixed position for items

本文关键字:位置 定位      更新时间:2023-10-16

是否有C++容器可以保证对发生过更改的项目有一个固定的指针?

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

p.S.编译时大小或固定大小不是的选项

编辑:正如@Joachim Pileborg所说,这是XY问题,或者实际上是XYZ问题!Z就是这个问题。Y如下所示:数据迭代器的保持向量

原始版本:

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

  • Lines集合
  • 每条线路的Points集合。。。换句话说,点集

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

有没有C++容器可以保证对发生过更改的项目有一个固定的指针?

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

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

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

关于你最初的问题:

考虑到您的需求,向原始容器返回一组迭代器/指针似乎确实很合适。如果迭代器在以后修改原始容器时必须保持有效,比如通过添加更多的点或删除任何分区都没有引用的点,那么原始容器的类型必须与本页讨论的类型相同。

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

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