異なる std::vector の値による std::vector の並べ替え
この問題には、ベクトルの順序を別のベクトルの順序。たとえば、ベクトル Index には数値 [3, 1, 2] が含まれ、ベクトル Values には文字列「Third、First、Second」が含まれます。インデックスを昇順 ([1, 2, 3]) で並べ替えると、値は対応する順序 (["First"、"Second"、"Third"]) で並べ替えられます。
ソリューション:
一般的なアプローチには、Index のインデックスと、Values の対応する要素を組み合わせてベクトル順序を作成することが含まれます。このベクトルは、Index 内の要素を比較するカスタム コンパレーターを使用して並べ替えることができます。
typedef vector<int>::const_iterator myiter; vector<pair<size_t, myiter>> order(Index.size()); size_t n = 0; for (myiter it = Index.begin(); it != Index.end(); ++it, ++n) order[n] = make_pair(n, it); struct ordering { bool operator ()(pair<size_t, myiter> const& a, pair<size_t, myiter> const& b) { return *(a.second) < *(b.second); } }; sort(order.begin(), order.end(), ordering());
結果の順序ベクトルには、並べ替えられたインデックスが含まれます。この順序を値に適用するには、次の関数を使用できます。
template <typename T> vector<T> sort_from_ref( vector<T> const& in, vector<pair<size_t, myiter>> const& reference ) { vector<T> ret(in.size()); size_t const size = in.size(); for (size_t i = 0; i < size; ++i) ret[i] = in[reference[i].first]; return ret; } Values = sort_from_ref(Values, order);
この関数は、元のベクトル in と、ソートされたインデックスを含む参照ベクトルを受け取り、それに応じてソートされた in のコピーを返します。
以上がある `std::vector` を別の `std::vector` の順序に基づいて並べ替える方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。