根据C ++中的列对双向量矢量进行排序

时间:2014-06-19 14:32:59

标签: c++ sorting vector codeblocks windows-7-x64

我有一个由向量​​组成的矩阵,其中每个表示行的元素由表示矩阵列的向量组成。我想根据第1列对行进行排序。

enter image description here

此矩阵中的每个元素都是double,尽管第一列包含一个用作标识符的数字(但不是唯一的)。

我的目标是使用SQL中可用的聚合函数,例如当我按第一列分组时,count()和sum()。

例如,如果我有:

ID       VALUE
1        10
2        20
1        30
2        40
3        60

我想得到:

ID       COUNT      MEAN
1        2          20
2        2          30
3        1          60

但是,我陷入了第一步:如何根据每行第一个元素的值对行进行排序?

我找到了一条线索on this topic,并将比较器更改为:

bool compareFunction (double i,double j)
{
    return (i<j);
}

但编译器对此并不满意(引用stl_algo.h文件):

error: cannot convert 'std::vector<double>' to 'double' in argument passing

因此,我想知道是否有办法在vectorvector包含double时对其进行排序。

4 个答案:

答案 0 :(得分:2)

您需要创建比较vector<double>

的比较器函数
struct VecComp {
  bool operator()(const vector<double>& _a, const vector<double>& _b) {
    //compare first elements
  }
}

然后,您可以使用新的比较器函数在结构上使用std::sort

std::sort(myMat.begin(), myMat.end(), VecComp());

如果您使用的是c ++ 11功能,您还可以在此处使用lambda函数:

std::sort(myMat.begin(), myMat.end(), [](const vector<double>& a, const vector<double>& b) {
    //compare the first elements
  }
);

答案 1 :(得分:2)

答案(imho):使用不同的数据结构。您要做的是设置多图。哦,嘿看:

http://www.cplusplus.com/reference/map/multimap/

stl::multimap - how do i get groups of data?

对于大量元素来说,它会更快。实际上它是一张地图而不是双向量的矢量。

或者,或者一起跳过排序,并使用std :: map,std :: unordered_map或(如果你知道键的数量和/或键偏移1而没有中断)按键计数的std ::矢量。

要进行扩展,对列表进行排序以获取均值将会很慢。排序(使用std :: sort)是O(nlogn),每次计算这个均值时都是O(nlogn)。这是一个有意义的步骤:你的东西按照关键的顺序分组。 std :: map和std :: multimap将&#34;按你的方式排序&#34;这将比每次排序快一点,但你不必对整个事情进行排序以获得列表。然后你可以迭代多图来得到均值,O(n)每个均值计算。 (将所有元素添加到多图中仍为O(nlg(n))

但是如果你知道关键输出将是1,2,3 ... n-1,n,那么排序完全是浪费时间。只需为每个键创建一个计数器(因为你知道键可以是什么)并在迭代数组时添加到键中。

但等等还有更多

如果密钥实际上是按照你的思维方式设置的,那么最好的方法就是忘记表格结构,并按照以下方式构建:

Index       VALUE
0           10,30
1           20,40
2           60

现在计数是每行的常量时间。每行的平均值为O(n)。获取列表是每行的固定时间。每个人都赢了。

答案 2 :(得分:1)

您需要编写自己的比较器函数来传递到vector声明:

struct comp {
    bool operator() (const std::vector<double>& i, 
                     const std::vector<double>& j) {
        return i[0] < j[0];
}

答案 3 :(得分:0)

你试过这个吗?:

std::sort(vecOfVecs.begin(), vecOfVecs.end());

这应该有效,因为std::vectoroperator<提供了词典排序,这比你想要的更具体。