std ::使用索引排序但保持索引顺序

Goz*_*Goz 3 c++ sorting stl

我有一个价值向量.我想根据这些值得到一个排序的索引列表.

我有合理的工作,除非出现相同的值.当出现相同的值时,我希望指数保持有序.

例如,我有这个测试用例:

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];
    } );
Run Code Online (Sandbox Code Playgroud)

这会将索引数组排序为以下内容:

(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)
Run Code Online (Sandbox Code Playgroud)

但我希望数组按以下顺序排列:

(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)
Run Code Online (Sandbox Code Playgroud)

有没有一种简单的方法可以修改我的lambda以按照上一个指定的顺序获取这些值?

提前干杯!

Mak*_*jov 7

你应该使用std :: stable_sort.

在您的特定情况下,您可以调整lambda以ab时间进行比较,val[a] == val[b]但这会使您的意图模糊到未来可能偶然发现此代码的开发人员.