Сортировка по карте (лексикографический порядок) - PullRequest
1 голос
/ 23 июня 2019

выходные данные должны быть отсортированы в лексикографически отсортированном порядке имен, а если два имени совпадают, то они сортируются в порядке убывания меток.

#include <iostream>
#include <map>
#include <tuple>

int main() {
    int t;
    std::cin >> t;
    while(t--) {
        int n;
        std::cin >> n;
        std::string name;
        int marks;
        std::map<std::pair<std::string, int>, int> hash;
        for(int i = 0; i < n; i++) {
            std::cin >> name >> marks;
            std::pair<std::string, int> p;
            p.first = name;
            p.second = marks;
            hash[p]++;
        }

        for(auto it = hash.begin(); it != hash.end(); ++it) {
            std::cout << (it->first).first << " " << (it->first).second << " "
                      << it->second << "\n";
        }
    }
    return 0;
}

1 Ответ

3 голосов
/ 23 июня 2019

Если вы хотите, чтобы записи карты были отсортированы в определенном порядке (а по умолчанию используется operator <, что не соответствует тому, что вы просите), то вам нужно создать свою карту с помощью специального компаратора.

struct myComp {
  bool operator()(const std::pair<std::string, int>& lhs, 
                  const std::pair<std::string, int>& rhs) const
      { /* your code here */ } 
};

std::map<std::pair<std::string, int>, int, myComp> m;

Ваш объект сравнения должен устанавливать строгий слабый порядок значений. Это означает, что для любых std::pair<std::string, int> a,b,c и myComp cmp:

  • cmp(a, a) неверно.
  • если cmp(a, b) верно, то cmp(b, a) неверно.
  • , если cmp(a, b) истинно и cmp(b, c) верно, тогда cmp(a, c) верно.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...