ホームページ >バックエンド開発 >C++ >C で `std::map` を値で効率的に並べ替えるにはどうすればよいですか?

C で `std::map` を値で効率的に並べ替えるにはどうすればよいですか?

DDD
DDDオリジナル
2024-12-02 09:29:10142ブラウズ

How Can I Efficiently Sort a `std::map` by Value in C  ?

値による 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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。