сортировка карты stl в c ++; ошибка: не соответствует оператору - - PullRequest
0 голосов
/ 04 августа 2020

Я получаю сообщение об ошибке «нет соответствия для оператора-». Это происходит, когда я использую функцию sort ().

#include <bits/stdc++.h>
using namespace std;

bool comp(pair<char, int> &a, pair<char, int> &b)
{
    return a.first < b.first ? 1 : -1;
}

int main() {
    // your code goes here
    int t;
    cin >> t;
    while (t--)
    {
        string s;
        cin >> s;
        map<char, int> m;
        for(int i = 0; i < s.size(); i++)
        {
            m[s[i]]++;
            cout << (char)s[i];
        }
        cout << "hello";
        sort(m.begin(), m.end(), comp);
    }
    return 0;
}

image

образ

1 Ответ

6 голосов
/ 04 августа 2020

std::sort() требует итераторов с произвольным доступом, но std::map итераторы не являются итераторами с произвольным доступом, поэтому вы не можете вызывать std::sort() на std::map, поскольку они не реализуют operator-.

std::map - это отсортированный контейнер, отсортированный по его ключам. А поскольку ваши ключи простые char, они уже сопоставимы как есть.

правильный способ настраиваемой сортировки std::map - это либо:

  1. укажите компаратор непосредственно в декларации map, например:
#include <bits/stdc++.h>
using namespace std;

struct comp {
    bool operator()(const char &a, const char &b) const {
        return a < b; // or whatever you want...
    }
};

int main() {
    // your code goes here
    int t;
    cin >> t;
    while (t--) {
        string s;
        cin >> s;
        map<char, int, comp> m;
        for(int i = 0; i < s.size(); i++) {
            m[s[i]]++;
            cout << s[i];
        }
        cout << "hello";
    }
    return 0;
}
Укажите operator< для типа ключа. Вы не можете перегрузить операторы для основных типов, но можете для пользовательских типов:
#include <bits/stdc++.h>
using namespace std;

struct my_key {
    char value;
    my_key(char ch) : value(ch) {}
    bool operator<(const char &rhs) const {
        return value < rhs.value; // or whatever you want...
    }
};

int main() {
    // your code goes here
    int t;
    cin >> t;
    while (t--) {
        string s;
        cin >> s;
        map<my_key, int> m;
        for(int i = 0; i < s.size(); i++) {
            m[s[i]]++;
            cout << s[i];
        }
        cout << "hello";
    }
    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...