値で std::map を並べ替える方法
キーではなく値で std::map を並べ替えるのは難しい場合があります。一般的な解決策の 1 つは、キーと値のペアを反転して並べ替える一時的なマルチマップを作成することです。ただし、よりクリーンで汎用性の高いアプローチを提供できる代替手法があります。
ペアの反転
次のコード スニペットは、キーと値のペアを反転する方法を示しています。 std::map で、値でソートされた新しいマルチマップを作成します:
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); } 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; }
元のマルチマップで flip_map を呼び出すことによってstd::map を使用すると、値でソートされたマルチマップを取得できます。
Generic Associative Source
このアプローチは、可変引数テンプレートを使用して任意のタイプの連想コンテナーを反転するように一般化できます。 :
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::transform アルゴリズム (std::map および std::unowned_map を含む)。
以上がstd::map を値で効率的に並べ替える方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。