[英]STL vector and pointers to elements of vector
有两个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)?
我不这么认为。 您可以通过仅将一个带有shared_ptr
的向量用于对象,或者仅使用ptr_vector
来避免麻烦。
有几种解决方法:
v_objects
来存储指向对象的指针 (这会使内存管理复杂化,但是使用智能指针可能会有所帮助)。 v_ptr
以将索引存储到v_objects
而不是将指针存储到v_objects
中。 我个人的偏爱是后者。
我不完全了解您要做什么,但是您可以将索引存储在容器中,而不是指针。 用于排序的比较器函子将存储对向量的引用,并取消对元素的引用以获得值。
只要原始向量中元素的顺序不变(即仅在末尾插入),索引向量将仍然有效。 如何处理新添加的元素,或者是否对原始向量执行了任何其他更改,则是另外一个故事:
// 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 ) );
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.