c++ - 如何将元素添加到排序列表中......? (C++)

标签 c++ arrays sorting

我刚刚第一次接触 std::vector,现在我想改掉使用纯 C 风格数组的坏习惯。我发现 std::list 是排序时要使用的容器。但是,我不是 100% 如何完成以下操作:

我正在做一些计算,其结果取决于两个指​​数(i 和 j)。最后我只对 100 个最小的结果感兴趣(不一定是 100 个,但肯定比我的计算值总数小得多,下面代码中的 m*n)。

const int L = 100;
int i_list[L];
int j_list[L];
double value_list[L];

for (int i=0;i<m;i++){
    for (int j=0;j<n;j++){
        double x = doSomeCalculations(i,j);
        insertTheValueAndIndices(i,j,x,i_list,j_list,value_list);
    }
}

完成后,value_list 应包含 100 个最小值(递增顺序)和 i_list/j_list 相应的索引。我有一个“insertValuesAndIndices()”的工作版本,但我使用普通数组和插入新值的最低效方式。在写作时我意识到我实际上有 2 个不同的问题:

  1. 计算值的数量 (m*n) 远远大于我想要保留在列表中的数量,因此简单地保留所有值并最终只排序一次并不是真正的选择。另一方面,我只需要最后以正确的顺序排列结果,所以也许有一种方法可以只对列表进行一次排序。是否有任何“标准”的巧妙且有效的方法来进行这种排序?

  2. 即使我可以存储所有结果并在之后进行排序,我也不确定如何使用 std::list.sort() 以正确的顺序获取索引数组。我想到的是定义一些包含结果和两个索引的类,将这些元素放在一个列表中,然后使用一个只检查值的比较器来进行排序。但是,也许有更直接的方法来做到这一点?

提前干杯和感谢

最佳答案

首先,您可能不想要 std::list ,但是std::vector . 然后使用 std::lower_bound 找到插入的位置,如果 结果 vector 包含的元素数量超过 你感兴趣,std::vector<>::pop_back摆脱 额外的一个。

关于c++ - 如何将元素添加到排序列表中......? (C++),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26675908/

相关文章:

javascript - 为什么我不能使用 slice 或 lodash remove 从这个数组中删除项目?

java - 如何在java中按字母顺序排列组合框? (使用 Netbeans IDE 7.3)

c++ - 如何在qt/c中打印所有小数的long double?

java - 检索数组中的随机元素而不重复位置

c++ - 有效地从未排序的数组中获取前 50 个最高数字

javascript - $.each 传递值给函数

c++ - Quicksort 给出常量而不是随机数的 stackoverflow

Javascript 首先对重复值进行排序,然后从小到大的值排序

c++ - 为什么 CMFCMenuBar 没有使用快捷键表?

c++ - 代码如何在 C++ 抽象机上存储和执行?