C で元の位置を保持しながらデータを並べ替える
C では、元の位置を保持しながら要素のコレクションを並べ替える必要がよくあります。 。外部要因がこれらの位置に依存する場合、これは非常に重要です。
サンプルセット A = [5, 2, 1, 4, 3] を考えてみましょう。標準の並べ替え関数を使用してこのセットを並べ替えると、B = [1,2,3,4,5] が生成されます。ただし、並べ替えられた要素の元のインデックスも追跡したいので、セット C = [2, 1, 4, 3, 0] になります。これは、元の A 内の B の各要素のインデックスを示します。
C 11 ラムダを使用した解決策
C 11 ラムダは、これを解決する便利な方法を提供します問題:
#include <iostream> #include <vector> #include <numeric> #include <algorithm> using namespace std; template <typename T> vector<size_t> sort_indexes(const vector<T> &v) { // Initialize original index locations vector<size_t> idx(v.size()); iota(idx.begin(), idx.end(), 0); // Sort indexes based on comparing values in v stable_sort(idx.begin(), idx.end(), [&v](size_t i1, size_t i2) {return v[i1] < v[i2];}); return idx; }
この実装では、最初に元のインデックスを使用してベクトル idx を作成します。次に、stable_sort を使用してインデックスを並べ替え、等しい値を持つ要素が相対的な順序を維持するようにします。結果のベクトル idx には、ソートされたインデックスが含まれます。
使用法
この関数を使用するには、単に値のベクトルを渡し、ソートされたインデックスを反復処理します。
for (auto i: sort_indexes(v)) { cout << v[i] << endl; }
カスタマイズ
sort_indexes 関数は、特定の要件に合わせてカスタマイズできます。たとえば、独自のオリジナルのインデックス ベクトルを提供したり、カスタムの並べ替え関数やコンパレータを指定したり、追加のベクトルを使用して並べ替え中に v を並べ替えたりできます。
以上が元のインデックスを維持しながら C でデータを並べ替えるにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。