按值对 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中文网其他相关文章!