代码之家  ›  专栏  ›  技术社区  ›  AshleysBrain

使用STL按成员订购容器

  •  3
  • AshleysBrain  · 技术社区  · 15 年前

    假设我有一些数据存储在一个 unique_ptr

    struct MyData {
        int id;  // a unique id for this particular instance
        data some_data; // arbitrary additional data
    };
    
    // ...
    
    std::vector<std::unique_ptr<MyData>> my_data_vec;
    

    排序 my_data_vec 这很重要。假设现在我有另一个MyDatas的id向量:

    std::vector<int> my_data_ids;
    

    我现在想重新安排一下 我的数据 使元素按 my_data_ids 唯一\u ptr 需要移动语义 std::move() .)

    实现这一点最有效的算法是什么?STL算法是否适合实现这一点?我看不出来 std::sort 会有任何帮助的。

    编辑:我可以使用O(n)内存空间(不太担心内存),但是id是任意的(在我的特定情况下,它们实际上是随机生成的)。

    3 回复  |  直到 15 年前
        1
  •  3
  •   sbi    15 年前
    1. my_data_ids .
    2. std::unique_ptr<MyData> 根据他们的身份证在地图上的索引。
    3. std::sort 排序 my_data_vec

    下面是一个草图:

    // Beware, brain-compiled code ahead!
    typedef std::vector<int> my_data_ids_type;
    typedef std::map<int,my_data_ids_type::size_type> my_data_ids_map_type;
    
    class my_id_comparator : public std::binary_function< bool
                                                        , std::unique_ptr<MyData>
                                                        , std::unique_ptr<MyData> > {
    public:
      my_id_comparator(const my_data_ids_map_type& my_data_ids_map)
        : my_data_ids_map_(my_data_ids_map) {}
    
      bool operator()( const std::unique_ptr<MyData>& lhs
                     , const std::unique_ptr<MyData>& rhs ) const
      {
         my_data_ids_map_type::const_iterator it_lhs = my_data_ids_map_.find(lhs.id);
         my_data_ids_map_type::const_iterator it_rhs = my_data_ids_map_.find(rhs.id);
         if( it_lhs == my_data_ids_map_.end() || it_rhs == my_data_ids_map_.end() )
           throw "dammit!"; // whatever
         return it_lhs->second < it_rhs->second;
      }
    private
      my_data_ids_map_type& my_data_ids_map_;
    };
    
    //...
    
    my_data_ids_map_type my_data_ids_map;
    // ...
    // populate my_data_ids_map with the IDs and their indexes from my_data_ids
    // ...
    std::sort( my_data_vec.begin(), my_data_vec.end(), my_id_comparator(my_data_ids_map) );
    

    如果内存不足,但时间无关紧要,你可以去掉地图,在地图上搜索ID 我的\u数据\u ID 真正地 因为每次比较两个线性复杂的操作将是相当昂贵的,所以迫切需要内存来实现这一点。

        2
  •  0
  •   Ioan Paul Pirau    15 年前

        3
  •  0
  •   rlbond    15 年前

    你为什么不直接用 map<int, unique_ptr<MyData>> (或 multimap