【问题标题】:STL vector and pointers to elements of vectorSTL 向量和指向向量元素的指针
【发布时间】:2011-10-10 11:13:26
【问题描述】:

有两个 STL 向量,一个带有对象,第二个带有指向对象的指针。

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

Vector v_ptr 用于对 v_objects 中的元素进行排序。假设向 v_objects 添加了一些东西,所以它看起来像:

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

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

【问题讨论】:

  • 为什么你甚至有 2 个向量呢?一个还不够吗?

标签: c++ stl


【解决方案1】:

我不这么认为。您可以通过使用带有shared_ptrs 的单个向量来为您的对象省去麻烦,或者只使用ptr_vector

【讨论】:

    【解决方案2】:

    有几种方法可以解决这个问题:

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

    我个人更喜欢后者。

    【讨论】:

      【解决方案3】:

      我不完全理解您想要做什么,但您可以将索引存储到容器中,而不是指针。用于排序的比较器仿函数将存储对向量的引用并取消引用元素以获得值。

      只要原始向量中元素的顺序没有改变(即仅在末尾插入),索引向量仍然有效。如何处理新添加的元素,或者如果对原始向量执行任何其他更改,则另当别论:

      // 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 ) );
      

      【讨论】:

        猜你喜欢
        • 2011-03-12
        • 1970-01-01
        • 2011-08-04
        • 2015-12-06
        • 2018-12-16
        • 1970-01-01
        • 2011-07-08
        • 2013-07-19
        • 1970-01-01
        相关资源
        最近更新 更多