値による std::map の並べ替え
キーではなく値による std::map の並べ替えは、さまざまなプログラミングシナリオ。この記事では、カスタム テンプレート関数を使用してマップ内のキーと値のペアを反転することで、この問題に対する洗練された解決策を提供します。
ペアとマップを反転するためのカスタム テンプレート関数
提供されるソリューションには、flip_pair() と flip_map() という 2 つのカスタム テンプレート関数が含まれます。 flick_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::unowned_map など) は、より汎用的な関数であり、std::map と std::map の両方を処理するために使用できます。 std::unowned_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::unowned_map など、必要なテンプレート パラメーターをサポートする任意の連想コンテナーで使用できます。
以上がC で `std::map` を値で効率的に並べ替えるにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。