使用索引排序,但保持索引顺序
std::sort using indices but maintaining index order
我有一个值向量。我想根据这些值得到一个排序的索引列表。
我已经得到这个工作相当好,除了相同的值发生。当出现相同的值时,我希望索引保持顺序。
例如,我有这个测试用例:
std::vector< size_t > idx;
std::vector< int > val;
for( int i = 0; i < 40; i++ )
{
idx.push_back( i );
val.push_back( i % 10 );
}
std::sort( idx.begin(), idx.end(), [&]( size_t a, size_t b )
{
return val[a] < val[b];
} );
将索引数组排序为以下内容:
(0,10,30,20,1,31,21,11,2,22,12,32,3,13,23,33,4,14,24,34,5,15,25,35,6,16,26,36,7,17,27,37,8,28,18,38,9,29,19,39)
但是我希望数组的顺序是:
(0,10,20,30,1,11,21,31,2,12,22,32,3,13,23,33,4,14,24,34,5,15,25,35,6,16,26,36,7,17,27,37,8,18,28,38,9,19,29,39)
是否有一种简单的方法,我可以修改我的lambda来获得这些值在最后指定的顺序?
提前干杯!
您应该使用std::stable_sort。
在您的具体情况下,您可以调整lambda以在val[a] == val[b]
时比较a
和b
,但这会使您的意图对任何将来可能偶然发现此代码的未来开发人员变得模糊。
当val[a] == val[b]时,返回两个索引中较小的一个
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
vector<int> val;
int compare(int a,int b)
{
if(val[a] == val[b]) {
return a < b;
}
return val[a] < val[b];
}
int main()
{
vector<int> idx;
int i;
for(i = 0; i < 40; i++) {
idx.push_back(i);
val.push_back(i%10);
}
sort(idx.begin(),idx.end(),compare);
for(i = 0; i < 40; i++) {
cout<<idx[i]<<' ';
}
}
相关文章:
- 数组索引的值没有增加
- CMake-按正确顺序将项目与C运行时对象文件链接
- 函数调用中参数的顺序重要吗
- 为什么不;名字在地图上是按顺序排列的吗
- 按字母顺序对C++问题中的子字符串索引进行分区
- 查找数组的第一个和最后一个索引,其中 from 和 to 元素的顺序总和最大
- 编写一个递归功能,该功能采用数组并以相反顺序显示元素,而无需在末尾启动数组的索引
- 创建按顺序索引的有序映射
- 通过索引快速搜索,并将插入顺序保持在C 中
- C++递归函数,可反转数组索引在两个边界之间的顺序
- 更改索引顺序 C++ 时的堆损坏
- 在 c++ 中,基于范围的 for 循环将保留索引顺序
- 获取元素在boost::multi_index_container的顺序索引中的位置
- 在不使用预定义的C++函数的情况下,按字母顺序打印存储在哈希表中每个索引处的名称
- 从给定索引上的向量中移除元素,顺序无关紧要
- 使用索引排序,但保持索引顺序
- 提振.Multi_index:以反向顺序遍历索引
- 在不改变索引顺序的情况下从动态数组中删除元素
- 按索引值的字母顺序对向量进行排序
- 用于按排序顺序存储元素并允许快速索引的数据结构