Как отсортировать карту в C ++ по значению, но если значения равны по ключам? - PullRequest
0 голосов
/ 05 октября 2018

Я хочу отсортировать свою карту по целым числам в порядке убывания, но если значения равны, я хочу отсортировать по строкам.У меня есть этот код, где я сортирую карту, а затем записываю первые 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>> ')

Ответы [ 2 ]

0 голосов
/ 05 октября 2018

Простой способ сравнения с помощью thing1 затем thing2 затем ... состоит в использовании std::tuple s operator < и 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);
}
0 голосов
/ 05 октября 2018

Работает, вы должны только зацикливаться на «setOfWords» вместо «m» при получении отсортированных результатов.

    for(auto it = m.begin(); it != m.end(); it++){
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...