【问题标题】:How to sort a map of map by 2nd element?如何按第二个元素对地图进行排序?
【发布时间】:2020-05-24 07:34:21
【问题描述】:

我有一张地图 map<int, map<char,int> > m; 的地图,我想按内部地图的第二个元素对其进行排序,即按 map<char, int> 的 int 值降序排列

我用它对地图的第二个元素进行排序,但在这里我想按降序对内部地图的第二个元素进行排序


    template <typename T1, typename T2>
    struct less_second {
        typedef pair<T1, T2> type;
        bool operator ()(type const& a, type const& b) const {
            return a.second < b.second;
        }
    };

    map<string, int> mymap;
    // …

    vector<pair<string, int> > mapcopy(mymap.begin(), mymap.end());
    sort(mapcopy.begin(), mapcopy.end(), less_second<string, int>());

编辑:例如我的地图有以下值:

{3 {A 1}
{D 2}},
{6 {C 2}},
{9 {A 1}
{B 2}},
{12 {B 3}
{C 1}}

那么它应该按照内部映射的第二个元素降序排序

{12 {B 3}
{C 1}},
{6 {C 2}},
{3 {A 1}
{D 2}},
{9 {A 1}
{B 2}}

【问题讨论】:

  • 这对我来说并不完全清楚。您能否提供示例数据和预期结果?您想对一个容器容器进行排序。您想通过内部容器中元素的属性对外部容器进行排序吗?
  • @ThomasSablik 我添加了一些例子来说明问题

标签: c++ sorting dictionary vector


【解决方案1】:

这会将map&lt;int, map&lt;char, int&gt;&gt; 的元素复制到vector&lt;pair&lt;int, map&lt;char, int&gt;&gt;&gt; 中,并根据地图中第一个元素的值对向量进行排序

#include <numeric>
#include <iostream>
#include <map>
#include <string>
#include <vector>
using std::cout;
using std::pair;
using std::string;
using std::vector;
using namespace std::literals::string_literals;

auto f1(const std::map<char, int> &m) {
    return std::accumulate(
        std::next(std::begin(m)),
        std::end(m),
        std::begin(m)->first + ": "s + std::to_string(std::begin(m)->second),
        [](const auto &lhs, const auto &rhs) {
            return lhs + ", "s + rhs.first + ": "s + std::to_string(rhs.second);
        });
}

auto &operator<<(std::ostream &os, const std::vector<std::pair<int, std::map<char, int>>> &m) {
    return os << "{\n"
       << std::accumulate(
        std::next(std::begin(m)),
        std::end(m),
        std::to_string(std::begin(m)->first) + ": { "s + f1(std::begin(m)->second) + " }"s,
        [](const auto &lhs, const auto &rhs) {
            return lhs + ",\n"s + std::to_string(rhs.first) + ": { "s + f1(rhs.second) + " }"s;
        })
       << "\n}\n";
}

int main() {
    std::map<int, std::map<char, int>> mymap{ {3, {{'A', 1}, {'D', 2}}}, {6, {{'C', 2}}}, {9, {{'A', 1}, {'B', 2}}}, {12, {{'B', 3}, {'C', 1}}} };

    std::vector<std::pair<int, std::map<char, int>>> mapcopy(mymap.begin(), mymap.end());
    sort(mapcopy.begin(), mapcopy.end(), [](const auto &lhs, const auto &rhs){
        return lhs.second.cbegin()->second > rhs.second.cbegin()->second;
    });

    std::cout << mapcopy;
}

输出:

{
12: { B: 3, C: 1 },
6: { C: 2 },
3: { A: 1, D: 2 },
9: { A: 1, B: 2 }
}

【讨论】:

    猜你喜欢
    • 2012-03-08
    • 2011-02-07
    • 2022-02-12
    • 1970-01-01
    • 1970-01-01
    • 2021-10-16
    • 2022-08-18
    • 2015-06-16
    • 1970-01-01
    相关资源
    最近更新 更多