2011-10-10 93 views
1

有两个STL矢量,一个是对象,另一个是指向对象的指针。STL矢量和指向元素的矢量

v_objects = [obj1, obj2, obj3, obj4] 
v_ptr = [ptr_to_obj1, ptr_to_obj2, ptr_to_obj3, ptr_to_obj4] 

向量v_ptr用于对v_objects中的元素进行排序。比方说,一些被添加到v_objects所以它看起来像:

v_objects = [obj1, obj2, obj3, obj4, obj5] 

假设v_objects是插入再分配别的地方,在v_ptr指针无效后。现在我想用v_ptr中的指针对对象进行排序,但它们是无效的。是否有可能创建一些指向与重新分配之前相同的对象的智能指针(使用stl :: vector)?

+2

为什么你甚至有2个向量呢?会不会足够? – Xeo

回答

4

我不这么认为。你可以通过使用一个带有shared_ptr的单个向量来为自己的对象节省麻烦,或者仅仅使用ptr_vector

3

有几种方法来解决这个:

  1. 你可以改变v_objects存储对象指针(这将复杂的内存管理,但使用智能指针可能会帮助)。
  2. 您可以更改v_ptr以将索引存储为v_objects而不是指针。

我个人的偏好是后者。

1

我不完全明白你想要做什么,但你可以存储索引到容器中,而不是指针。用于排序的比较器函子将存储对矢量的引用并对元素进行解引用以获取值。

只要原始矢量中元素的顺序没有改变(即仅在末尾插入),索引矢量仍然有效。如何处理新添加的元素,或者是否对原始矢量执行其他更改是另一回事:

// sketch (reorganize code as needed): 
std::vector<type> original = load(); 
struct compare_indexed { 
    std::vector<type> const & v; 
    compare_indexed(std::vector<type> const & v) : v(v) {} 
    bool operator()(int lhs, int rhs) const { 
     return v[lhs] < v[rhs]; 
    } 
}; 
// Create original index vector 
std::vector<int> indices; 
for (unsingned int i = 0; i < original.size(); ++i) { 
    indices.push_back(i); 
} 
std::sort(indices.begin(), indices.end(), compare_indexed(original));