按值對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中文網其他相關文章!