4

次のことを行う必要があります。

を指定すると、ベクトルがソートされた場合に含まれるインデックスでstd::vectorそれぞれintを置き換える必要があります。int

例を挙げてよりよく説明しようと思います。

入力:{22, 149,31}

出力:{2, 0, 1}

(ソートされたベクトル {149, 31, 22} では、22はソートされたベクトルのインデックス 2にあり、 149インデックス 0にあり、31インデックス 1にあることに注意してください)

アルゴリズムを明確にすることを願っています。

これは何らかの方法で STL C++11 ライブラリに実装されていますか? このアルゴリズムに名前はありますか? エレガントに実装するためのアイデアを提供できますか?

4

1 に答える 1

13

名前はないと思いますが、簡単にできます。

まず、ターゲット ベクトルを作成し、インデックス 0...n で埋めます。

vector<int> indices(input.size());
std::iota(indices.begin(), indices.end(), 0);

次に、そのベクトルを並べ替えますが、ベクトル内の数値を比較する代わりに、入力ベクトル内の関連するインデックスの数値を比較します。

std::sort(indices.begin(), indices.end(),
          [&input](int l, int r) { return input[l] < input[r]; });

編集降順を探しているのに対し、私は昇順でソートしていることに注意してください。ラムダで比較を反転するだけです。

于 2013-10-17T16:33:21.300 に答える