ホームページ >バックエンド開発 >C++ >ある `std::vector` を別の `std::vector` の順序に基づいて並べ替える方法

ある `std::vector` を別の `std::vector` の順序に基づいて並べ替える方法

DDD
DDDオリジナル
2024-12-07 12:16:13727ブラウズ

How to Sort One `std::vector` Based on the Order of Another?

異なる 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&amp; a, pair<size_t, myiter> const&amp; b) {
        return *(a.second) < *(b.second);
    }
};

sort(order.begin(), order.end(), ordering());

結果の順序ベクトルには、並べ替えられたインデックスが含まれます。この順序を値に適用するには、次の関数を使用できます。

template <typename T>
vector<T> sort_from_ref(
    vector<T> const&amp; in,
    vector<pair<size_t, myiter>> const&amp; 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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。