在C std :: Priority_queue中反向字母排序顺序的简单方法

Simple way to reverse alphabetical sort order in C++ std::priority_queue?

本文关键字:排序 顺序 方法 简单 std Priority queue      更新时间:2023-10-16

嗨,我正在求解某种排序算法问题。

我使用的是用STL队列标头的C STL Priority_queue用一个整数编号对字符串输入进行排序。

我知道有一个简单的想法可以用像这样的优先级进行整数排序的增量顺序。

#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 Operator Overloading解决此问题。

但是有没有任何简单而体面的方式可以实现反向字母顺序而无需实施操作员过载?

您绝对不要使用真实代码中的嵌套对使用这种复杂的数据结构。它使代码难以理解。什么是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...
    }
};