我计划使用这种类型来组织一些数据:std::unordered_map<std::string,std::vector<double>>
它很好地表示了一个具有可变数量的动态命名列和可变数量的行的表(向量将始终具有相同的构造大小)。
一个要求是可以根据列对表进行排序,这意味着:对映射中的向量进行排序,也对所有其他向量应用相同的交换。编写一个蹩脚的算法来做到这一点并不难,但是利用 stl 的强大功能呢?有没有办法做到这一点?只要满足灵活性要求,更改数据类型就不是问题。
我计划使用这种类型来组织一些数据:std::unordered_map<std::string,std::vector<double>>
它很好地表示了一个具有可变数量的动态命名列和可变数量的行的表(向量将始终具有相同的构造大小)。
一个要求是可以根据列对表进行排序,这意味着:对映射中的向量进行排序,也对所有其他向量应用相同的交换。编写一个蹩脚的算法来做到这一点并不难,但是利用 stl 的强大功能呢?有没有办法做到这一点?只要满足灵活性要求,更改数据类型就不是问题。
您可以创建一个特殊的迭代器,该迭代器充当您排序所依据的向量的对应元素数组的迭代器。您必须创建自己的引用类型,就像在 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。它还将让您对可能在其他地方派上用场的向量有一个有趣的看法。