c++ - 根据 C++ 中的列对具有 double 的 vector 的 vector 进行排序

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

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

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

因此我想知道是否有一种方法可以对包含 doublevector 进行排序。

最佳答案

答案(恕我直言):使用不同的数据结构。您要做的是设置 multimap 。哦,嘿,看:

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

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

对于大量元素,它会更快。并且实际上是一个映射而不是 double vector 的 vector 。

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

要扩展,对列表进行排序以获取均值会很慢。排序(使用 std::sort)是 O(nlogn),每次计算这个平均值时都会是 O(nlogn)。这是一个不必要的步骤:你的东西是按关键分组的,而不考虑顺序。 std::map 和 std::multimap 将“边走边排序”,这将比每次排序快一点,但您不必对整个事物进行排序以获得列表。然后你可以迭代 multimap 以获得平均值,O(n)每个平均值计算。 (将所有元素添加到multimap仍然是O(nlg(n)))

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

但还有更多

如果 key 实际上是按照您的想法设置的,那么从一开始最好的方法就是忘记表结构,然后像这样构建它:

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

Count 现在是每行的常数时间。每行的平均值为 O(n)。获取列表是每一行的恒定时间。人人皆赢。

关于c++ - 根据 C++ 中的列对具有 double 的 vector 的 vector 进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24309171/

相关文章:

c# - 按文件名的内容对文件进行排序

c++ - Google 测试和 std::vector 范围异常

c++ - Informix 错误后进程崩溃

java - 对 java ConcurrentHashMap 中的值进行排序

arrays - 按函数对(对称)numpy 二维数组进行排序。 (规范)

c++ - 存储未初始化的 STL vector ?

c++ - vector 多重定义链接错误

c++ - 将 FFmpeg 与 Direct Show 结合使用

c++ - 使用 unix 套接字的同步 boost asio 中的延迟/延迟

c++ - 从 mex 函数清除 MATLAB 命令窗口