我想根据第一行中的数据快速对多维向量进行排序。有办法做到这一点(see answers to this post)但我正在寻找一种不使用C ++ 11的快速有效的方法(即,对于提供的第二种解决方案,我想避免创建和复制向量的成本) 。我试图看看Boost是否具有类似于C ++ 11的良好排序功能,但我是C ++的新手并且无法弄明白。基本上,我的数据看起来像:
std::vector<std::vector<double> > data(2, std::vector<double>(5, 0.0));
data[0][0] = 2.0; data[1][0] = 4.0;
data[0][1] = 1.0; data[1][1] = 6.0;
data[0][2] = 3.0; data[1][2] = 5.0;
data[0][3] = 2.1; data[1][3] = 3.3;
data[0][4] = 0.3; data[1][4] = 5.7;
我希望对数据进行排序,以便我有
data[0][0] = 0.3; data[1][0] = 5.7;
data[0][1] = 1.0; data[1][1] = 6.0;
data[0][2] = 2.0; data[1][2] = 4.0;
data[0][3] = 2.1; data[1][3] = 3.3;
data[0][4] = 3.0; data[1][4] = 5.0;
请注意,我正在使用向量,因为我事先并不知道数据的大小,但数据将是矩形的,并且比此处提供的2x5示例大得多。
答案 0 :(得分:4)
首先,声明一个仿函数:
struct FirstColumnOnlyCmp
{
bool operator()(const std::vector<double>& lhs,
const std::vector<double>& rhs) const
{
return lhs[0] < rhs[0];
}
};
然后,在std::sort
调用中使用它:
std::sort(data.begin(), data.end(), FirstColumnOnlyCmp());
就是这样。 C ++ 11不是必需的,它只是让这些事情变得更容易,因为你可以用lambda而不是functor完成所有这些。
我留给你的是确保data
集合中的所有向量都至少有一个元素来避免调用UB(我假设它们会这样做,否则你的逻辑比较可能需要更复杂。< / p>