通过第1列排序多维向量

时间:2014-02-24 03:50:06

标签: c++ sorting vector

我想根据第一行中的数据快速对多维向量进行排序。有办法做到这一点(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示例大得多。

1 个答案:

答案 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>