假设我有一个简单的连续数组或包含一些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
什么是有效的(在性能和内存占用方面[尽管可能相辅相成])系统用于在数组内容移动时保持这些指针更新?
一些注意事项:
答案 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
pos
和newpos
处的所有指针来更新交换指针。