【发布时间】:2014-10-31 13:30:37
【问题描述】:
我刚刚第一次接触 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()”的工作版本,但在那里我使用普通数组和插入新值的最低效的方式。在写作时,我意识到我实际上有两个不同的问题:
计算值的数量 (m*n) 远远大于我想要保留在列表中的数量,因此简单地保留所有值并最终只排序一次并不是一个真正的选择。另一方面,我最终只需要正确顺序的结果,所以也许有一种方法可以只对列表进行一次排序。这种排序有什么“标准”的聪明有效的方法吗?
即使我可以存储所有结果并在之后进行排序,我也不确定如何使用 std::list.sort() 以正确的顺序获取索引数组。我想到的是定义一些包含结果和两个索引的类,将这些元素放在一个列表中,然后使用一个只检查值的比较器进行排序。但是,也许有更直接的方法可以做到这一点?
提前致谢
【问题讨论】:
-
std::vector可以用std::sort排序。 -
"std::list 是排序时使用的容器" -- 嗯?你为什么这么说?任何序列容器都可以排序。
-
当然,您实际上并不需要排序。只需使用
std::lower_bound即可找到插入点。这样,您不必让向量增长到超出您需要的值。 -
@Drop No. 在某些情况下它是唯一的容器。插入时考虑迭代器的有效性。