首页 > 后端开发 > C++ > 如何在 C 中按值对 `std::map` 进行有效排序?

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

DDD
发布: 2024-12-02 09:29:10
原创
138 人浏览过

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

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板