首頁 >後端開發 >C++ >如何在 C 中按值對 `std::map` 進行有效排序?

如何在 C 中按值對 `std::map` 進行有效排序?

DDD
DDD原創
2024-12-02 09:29:10139瀏覽

How Can I Efficiently Sort a `std::map` by Value in C  ?

按值對std::map 進行排序

按值而不是鍵對std::map 進行排序是常見要求各種編程場景。本文透過使用自訂模板函數翻轉映射中的鍵和值對,為這個問題提供了一個優雅的解決方案。

用於翻轉對和映射的自訂模板函數

提供的解決方案涉及兩個自訂模板函數:flip_pair() 和 Flip_map()。 Flip_pair() 函數接受一對值並翻轉它們,從而產生一個具有交換值的新對。

template<typename A, typename B>
std::pair<B,A> flip_pair(const std::pair<A,B> &p)
{
    return std::pair<B,A>(p.second, p.first);
}

flip_map() 函數利用 Flip_pair() 函數來翻轉所有鍵 -來源映射中的值對,並傳回帶有翻轉對的新多重映射。

template<typename A, typename B>
std::multimap<B,A> flip_map(const std::map<A,B> &src)
{
    std::multimap<B,A> dst;
    std::transform(src.begin(), src.end(), std::inserter(dst, dst.begin()), 
                   flip_pair<A,B>);
    return dst;
}

範例用法

要按值對std::map 進行排序,可以使用Flip_map() 函數使用翻轉的對建立一個新的多重映射。此多重映射將按來源映射的先前值排序。

std::map<int, double> src;

...    

std::multimap<double, int> dst = flip_map(src);
// dst is now sorted by what used to be the value in src!

C 11 及更高版本的通用關聯來源

對於std 的替代關聯容器: :map,例如std::unordered_map,一個更通用的函數可以同時處理std::map和std::unordered_map 來源。

// flips an associative container of A,B pairs to B,A pairs
template<typename A, typename B, template<class,class,class...> class M, class... Args>
std::multimap<B,A> flip_map(const M<A,B,Args...>& src)
{
    std::multimap<B,A> dst;
    std::transform(src.begin(), src.end(),
                   std::inserter(dst, dst.begin()),
                   flip_pair<A,B>);
    return dst;
}

此函數可與任何支援所需模板參數的關聯容器一起使用,例如 std::map、std::unordered_map 等。

以上是如何在 C 中按值對 `std::map` 進行有效排序?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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