c++ - 当数组内容改变时更新指向数组元素的指针

标签 c++ optimization

假设我有一个简单的连续数组或 vector ,其中包含一些 T 类型的元素

std::vector<T> someVector;

我有几个指向分布在应用程序周围的 vector 内部的原始指针。

T* pointerOne = &someVector[5];
T* another = &someVector[42];
T* evenMore = &someVector[55];

但是, vector 中的元素有时会在应用程序中四处移动,这会使指针无效(如:不再指向它应该指向的位置):

std::swap(someVector[4],someVector[5]); //Oops! pointerOne now essentially points to whatever was in someVector[4], and the correct object that was in someVector[5] has moved places

什么是有效的(就性能和内存占用而言[尽管这可能是齐头并进的])系统,可以在数组内容移动时保持这些指针更新?

一些注意事项:

  • 元素很少改变它们的位置。 num(位置更改)<< num(对元素的访问)。这意味着我想保留更新的指针,而不是引入一些其他系统来抽象这个问题,因为取消引用指针的速度与我在应用程序中获得的速度一样快,性能在这里非常重要。
  • 所有的 T 总是在一个连续的数组中。它不会在开发过程中的某个时刻变成某种其他容器类型,例如 map 。
  • 我确实知道(并且可以修改)T 在数组内移动的代码部分。事实上,这发生在单个函数中。 IE。如果数组的内容发生变化,系统不需要监视内存并以某种方式在运行时自动检测。

最佳答案

持有指向指针的反向映射怎么样。这可能是原始数组长度的数组(或 vector ),其中包含指向您创建的指针的指针。例如,在此反向映射的索引 5 处,您将拥有指向原始数组中指向元素 5 的所有指针的指针。现在,如果元素 5 与元素 6 交换,只需遍历反向映射中索引 5 处的所有指针,将它们设置为指向原始数组中的元素 6,并将所有这些指针移动到反向映射的索引 6。您可以从代码中移动内容的单个点开始这项工作。

关于c++ - 当数组内容改变时更新指向数组元素的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23918784/

相关文章:

c++ - 如何在 Qt QImage 中使用颜色 LUT

c++ - 在 Windows 上首次安装 Qt 5

search - IMDB 搜索为何如此快速?

javascript - 在 Javascript 中轻松添加值数组(例如,没有循环)

vba - 需要帮助在 VBA 中优化 SUMIFS

flash - : a Timer, EnterFrame 事件或带有额外代码的基本补间动画哪个更有效?

c++ - 从 ifstream 获取转换失败的数据

c# - "symbol"中的 "Load Symbol List"是什么意思?

c++ 字符串到 boost::multiprecision::cpp_int

c# - 是否可以为自定义结构重载 "array assignment"?