【问题标题】:How to sort a map in C++ by value but if values are equal by keys?如何在 C++ 中按值对地图进行排序,但如果键值相等?
【发布时间】:2019-03-10 15:09:06
【问题描述】:

我想按整数对地图进行降序排序,但如果值相等,我想按字符串排序。我有这段代码,我在其中对地图进行排序,然后将前 k 个值写入向量:

   map<string, int> m;
vector<string> calc(int k) {
    typedef std::function<bool(std::pair<std::string, int>, std::pair<std::string, int>)> Comparator;

    Comparator compFunctor =
    [](std::pair<std::string, int> p1 ,std::pair<std::string, int> p2)
    {
        if(p1.second != p2.second){
            return p1.second > p2.second;
        }else{
            return p1.first > p2.first;
        }

    };
    std::set<std::pair<std::string, int>, Comparator> setOfWords(m.begin(), m.end(), compFunctor);
    int c = 0;
    vector<string> str;
    for(auto it = m.begin(); it != m.end(); it++){
        if(c >= k){
            break;
        }
        str.push_back(it->first);
        c += 1;
    }
    for(int i = 0; i<str.size(); i++){
        cout << str[i] << " ";
    }

    return str;
}
};

但是,它没有排序。

        auto cmp = [](std::pair<int,string> const & p1, std::pair<int,string> const & p2)
    {
                    if(p1.second != p2.second){
                        return p2.second > p1.second;
                  //  }
                 //   return true;
                    }else{
                        return p2.first > p1.first;
                    }
    };
    std::sort(m.begin(), m.end(), cmp);

我也试过了,但它甚至没有编译。它给了我二进制表达式的无效操作数('std::__1::__map_iterator, int>, std::__1::__tree_node, int>, void *> *, long> >' 和 'std::__1::__map_iterator , int>, std::__1::__tree_node, int>, void *> *, long> >')

【问题讨论】:

  • 您有一个std::map&lt;string, int&gt;,但您的cmp 函数比较std::pair&lt;int, string&gt;。你的意思是std::pair&lt;string, int&gt;
  • std::map 是排序容器,你说的排序是什么意思?
  • jamesdlin 哦,对不起,反之亦然
  • Öö Tiib 所以我应该使用无序地图吗?
  • 您不对地图进行排序。这没有道理。地图中元素的顺序是固定的,不能更改。无序映射中元素的顺序是不确定的,但仍然无法更改。

标签: c++ sorting dictionary


【解决方案1】:

在获得排序结果时,您只需循环“setOfWords”而不是“m”即可。

    for(auto it = m.begin(); it != m.end(); it++){

【讨论】:

  • 谢谢,出于某种原因,我认为它可以排序地图:P 傻我
【解决方案2】:

通过 thing1 然后 thing2 然后 ... 进行比较的简单方法是使用 std::tuple's operator &lt;std::tie 通过引用创建一个元组

using Item = std::pair<std::string, int>;
auto cmp = [](const Item & lhs, const Item & rhs) 
{ 
    return std::tie(lhs.second, lhs.first) < std::tie(rhs.second, rhs.first);
}

【讨论】:

    猜你喜欢
    • 2022-01-06
    • 2023-03-17
    • 2021-11-10
    • 2021-08-30
    • 1970-01-01
    • 2021-07-26
    • 2016-10-25
    • 2020-09-13
    • 2022-10-28
    相关资源
    最近更新 更多