当数组内容更改时,更新指向数组中元素的指针

时间:2014-05-28 18:03:26

标签: c++ optimization

假设我有一个简单的连续数组或包含一些T

类型元素的向量
std::vector<T> someVector;

我有几个指向应用程序周围的向量内部的原始指针。

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

但是,向量中的元素有时会在应用程序中移动,这会使指针无效(如:不指向它应该指向的内容):

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(位置变化)&lt;&lt; num(访问元素)。这意味着我想保留更新的指针,而不是引入一些其他系统来解决这个问题,因为取消引用指针的速度和我在应用程序中获得的速度一样快,而且性能在这里非常重要。
  • 所有Ts将始终位于连续数组内。它不会在某些时候发展变化成为其他容器类型,如地图。
  • 我知道(并且可以修改)Ts在数组内移动的代码部分。实际上,这发生在单个函数中。即系统不需要监视内存,并且在运行时会以某种方式自动检测数组内容是否发生变化。

2 个答案:

答案 0 :(得分:2)

如何将反向映射保存到指针。这可以是原始数组长度中的数组(或向量),其中包含指向您创建的指针的指针。例如,在此反向映射的索引5处,您将指向指向原始数组中元素5的所有指针。现在,如果元素5与say元素6交换,只需遍历索引5处反向映射中的所有指针,将它们设置为指向原始数组中的元素6,并将所有这些指针移动到反向映射的索引6。您可以从代码中移动内容的单点开始执行此操作。

答案 1 :(得分:0)

一个类似于user3678664建议的想法,针对向量中有很多元素且指针很少的情况进行了优化:

创建一个使用

的函数
multimap<int, T**> ptrmap;

保存指针的地址。

void RegisterPointer(int pos, T** ptr)
{
    ptrmap.insert(pair<int, T**>(pos, ptr));
}

然后编写一个函数void UpdateSwappedPtrs(int pos, int newpos),通过迭代ptrmap posnewpos处的所有指针来更新交换指针。