首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何将C++中的映射按值排序,但如果值按键相等则如何排序?

如何将C++中的映射按值排序,但如果值按键相等则如何排序?
EN

Stack Overflow用户
提问于 2018-10-05 07:02:22
回答 2查看 314关注 0票数 0

我想按ints排序,按递减顺序排列,但如果值相等,则按字符串排序。我有这样的代码,我对地图进行排序,然后将第一个k值写入向量:

代码语言:javascript
运行
复制
   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;
}
};

然而,它没有排序。

代码语言:javascript
运行
复制
        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> >')

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-10-05 07:19:58

它是工作的,当得到排序的结果时,您只应该遍历"setOfWords“而不是"m”。

代码语言:javascript
运行
复制
    for(auto it = m.begin(); it != m.end(); it++){
票数 2
EN

Stack Overflow用户

发布于 2018-10-05 08:27:45

thing1和thing2比较的一种简单方法。是使用operator <std::tie通过引用创建一个元组。

代码语言:javascript
运行
复制
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);
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52660027

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档