首頁 >後端開發 >C++ >如何依照另一個「std::vector」的順序對一個「std::vector」進行排序?

如何依照另一個「std::vector」的順序對一個「std::vector」進行排序?

DDD
DDD原創
2024-12-07 12:16:13729瀏覽

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 中的對應元素來建立向量順序。然後可以使用自訂比較器對該向量進行排序,該比較器比較索引中的元素:

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);

此函數採用原始向量和包含排序索引的參考向量,並傳回對應排序的副本。

以上是如何依照另一個「std::vector」的順序對一個「std::vector」進行排序?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn