Простой способ изменить алфавитный порядок сортировки в C++ std::priority_queue?

Привет, я решаю некоторые проблемы с алгоритмом сортировки.

Я использую C++ STL priority_queue с заголовком очереди STL для сортировки ввода строки в обратном алфавитном порядке с некоторыми целыми числами.

Я знаю, что есть простая идея реализовать последовательный порядок целочисленной сортировки с приоритетной очередью, подобной этой.

#include <queue>

priority_queue<int> pq;
int arr[5] = {4,3,2,1,5};

for(int i = 0; i < 5; i++)
   pq.push(-arr[i]);
while(!pq.empty()) {
   cout << -pq.top() << endl;
   pq.pop();
}
//the result may be 1, 2, 3, 4, 5

или я могу реализовать это, используя оператор меньше

priority_queue<int, vector<int>, less<int>> pq;
int arr[5] = {4,3,2,1,5};

for(int i = 0; i < 5; i++)
   pq.push(arr[i]);
while(!pq.empty()) {
   cout << pq.top() << endl;
   pq.pop();
}
//the result may be 1, 2, 3, 4, 5

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

priority_queue<pair<int, pair<int, pair<int, string>>>> pq;

Я знаю, что могу решить эту проблему с перегрузкой оператора priority_queue.

Но есть ли простой и достойный способ реализовать обратный алфавитный порядок без такой перегрузки операторов?

1 ответ

Вы никогда не должны использовать такую ​​сложную структуру данных, используя вложенные пары в реальном коде. Это делает код сложным для понимания. Что такое pq.top().second.second.first?

Если ваша структура сложная, то определите структуру с желаемыми членами, такими как это (но с осмысленными именами членов):

struct datastructure
{
    int member1;
    int member2;
    int member3;
    std::string member4;
};

Затем вы должны определить оператор сравнения. Это всего лишь несколько строк кода, и это делает ваш код более читабельным. Это может быть вложенным struct Если вы предпочитаете...

struct datastructure_comp
{
    bool operator()(const datastructure &lhs, const datastructure &rhs) const
    {
        return lhs.member1 < rhs.member2;
    }
};

Насколько я знаю, если вы просто хотите изменить порядок вашей сложной структуры данных, вы можете использовать std::greater вместо по умолчанию std::less (при условии, что все поля должны сравниваться в обратном порядке, а не только в первом).

Ну, если вы хотите по-прежнему использовать пары для простоты, то вы можете сделать что-то вроде этого:

class datastructure 
{
    std::pair<int, std::pair<int, std::pair<int, string>>>> data;

public:
    int GetValue1() const { return data.first; }
    void SetValue1(int value) { data.first = value; }

    // other access function here...
};

И тогда определение сравнения будет тривиальным:

struct datastructure_comp
{
    bool operator()(const datastructure &lhs, const datastructure &rhs) const
    {
        return lhs.data > rhs.data; // reversed sort...
    }
};
Другие вопросы по тегам