我打算使用这种类型组织一些数据:std::unordered_map<std::string,std::vector<double>>
很好地表示一个表,其中包含可变数量的动态命名列和可变数量的行(向量将始终具有相同的构造大小)。
要求是可以相对于列对表进行排序,这意味着:在地图中对向量应用相同的交换也对所有其他向量进行排序。编写一个糟糕的算法来做这个并不是很难,但是如何使用stl的强大功能呢?有没有办法做到这一点?只要满足灵活性要求,更改数据类型就不是问题。
答案 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。它还将为您提供一个有趣的视图,可以在其他地方派上用场。