将向量排序为unordered_map c ++ 11

时间:2013-08-13 14:24:05

标签: c++ sorting c++11 stdvector unordered-map

我打算使用这种类型组织一些数据:std::unordered_map<std::string,std::vector<double>>很好地表示一个表,其中包含可变数量的动态命名列和可变数量的行(向量将始终具有相同的构造大小)。

要求是可以相对于列对表进行排序,这意味着:在地图中对向量应用相同的交换也对所有其他向量进行排序。编写一个糟糕的算法来做这个并不是很难,但是如何使用stl的强大功能呢?有没有办法做到这一点?只要满足灵活性要求,更改数据类型就不是问题。

1 个答案:

答案 0 :(得分:0)

你可以创建一个特殊的迭代器,它作为一个迭代器,作为你要排序的向量的相应元素的数组。您将必须创建自己的引用类型,就像std :: vector中的情况一样。你将要确保你获得移动语义(假设你正在使用现代编译器),因为这将需要移动整个项目数组,你真的不希望这意味着复制IMO。此引用类型的赋值将迭代不同向量的一行,将相应的值从另一个引用的行分配给新的。

class my_refrence_type {
private:
    //special refrence to know which vector you are sorting by
    std::vector<double>& ref_vec;
    //refrence so you can get an iterator from the map to preform assignment
    std::unordered_map<std::string,std::vector<double>>& map;
    //a location in the vectors. this is the row number
    int loc;
public:
   /* insert constructors here and other blah blah blah*/
   my_refrence_type& operator=(my_refrence_type&& x) {
      for(auto& vec : map) {
          vec.second[loc] = std::move(vec.second[x.loc]);
      }
   }
   //a method to get the reference vector's value so you can create a comparison function 
   double& get_ref_value() {
       return ref_vec[loc];
   }
};

因此,回顾一下,您需要一种特殊的引用类型,它可以将向量中的行视为单个对象,并将迭代器类型视为这些行。如果你得到正确的排序应该使用普通的旧std :: sort。它还将为您提供一个有趣的视图,可以在其他地方派上用场。