繁体   English   中英

STL矢量和指向矢量元素的指针

[英]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来避免麻烦。

有几种解决方法:

  1. 您可以更改v_objects来存储指向对象的指针 (这会使内存管理复杂化,但是使用智能指针可能会有所帮助)。
  2. 您可以更改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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM