ホームページ > バックエンド開発 > C++ > 元のインデックスを維持しながら C でデータを並べ替えるにはどうすればよいですか?

元のインデックスを維持しながら C でデータを並べ替えるにはどうすればよいですか?

Barbara Streisand
リリース: 2024-12-21 16:28:09
オリジナル
472 人が閲覧しました

How Can I Sort Data in C   While Maintaining Original Indices?

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> &amp;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(),
       [&amp;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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート