1. ホーム
  2. c++

std::mapを値でソートする

2023-07-10 15:39:19

質問

をソートする必要があります。 std::map をキーではなく値でソートする必要があります。それを行うための簡単な方法はありますか?

私は以下のスレッドから1つの解決策を得ました。

std::map sort by data?

もっと良い解決策はないのでしょうか?

map<long, double> testMap;
// some code to generate the values in the map.

sort(testMap.begin(), testMap.end());  // is there any function like this to sort the 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;
}

int main(void)
{
    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 のような)、別のオーバーロードをコーディングすることもできますが、 結局動作は同じなので、可変個体テンプレートを使った一般的な連想コンテナで のどちらかを マッピングの構成に使用することができます。

// 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::mapstd::unordered_map をフリップのソースとして使用します。