сортировка пары ключ-значение по значениям, а также по ключам - PullRequest
0 голосов
/ 19 апреля 2020

PS в следующих строках: Лист отчета содержит subject --------- marks. Сортируйте отчет по меткам в порядке убывания. Если 2 предмета имеют одинаковые метки, сортируйте эти 2 строки по предметам, т.е. предметы с именем, которое появляется первым в лексикографическом порядке, находятся сверху. Какой будет хороший подход для решения этой PS? Это не сильно помогает

Я изначально пытался переопределить std :: map. Однако люди, пытающиеся помочь, отметили, что это не очень хорошая идея. Это был мой подход, который также привел меня в замешательство относительно того, где я на самом деле присваиваю значения ?:

class map : public std::map<std::string, long, std::greater<>> {
public:
    bool insert(std::pair<std::string, long> pair) {
        //where do I actually "put" the values??
    }
};

Я пытался использовать

typedef std::function<bool(std::pair<std::string, long>, std::pair<std::string, long>)> compareFunc;
compareFunc compare = [](std::pair<std::string, long> lmark, std::pair<std::string, long> rmarks) {
    if (lmarks.second > rmarks.second)
        return true;
    else if ((lmarks.second == rmarks.second) && (lmarks.first < rmarks.first))
        return true;
    return false;
};
std::set<std::pair<std::string, long>, compareFunc> marks;

Но во время выполнения это не удается

Пожалуйста, предложите мне лучший вариант

1 Ответ

1 голос
/ 19 апреля 2020

Есть похожий вопрос на HackerEarth Вот как я решил это:

#include <algorithm>
#include <iostream> 
#include <vector>

int main() {
    std::vector<std::pair<std::string, long>> hotels;
    long n = 0;
    std::cin >> n;
    while (n--) {
        std::pair<std::string, long> hotel;
        std::cin >> hotel.first >> hotel.second;
        hotels.push_back(hotel);
    }
    std::sort(hotels.begin(), hotels.end(), [](std::pair<std::string, long> lhotel, std::pair<std::string, long> rhotel)->bool {
        if (lhotel.second > rhotel.second)
            return true;
        else if ((lhotel.second == rhotel.second) && (lhotel.first < rhotel.first))
            return true;
        return false;
    });
    std::cout << hotels.front().first;
    return 0;
}

В вашем решении, просто используйте vector вместо set, и все будет хорошо:)

Просто для будущих ссылок, если вы хотите отклониться от стандартной реализации любого контейнера STL в c ++, всегда вместо go для векторов. Никогда не подводит;)

...