在C ++ std :: priority_queue中反转字母排序顺序的简单方法?

时间:2017-09-23 12:36:23

标签: c++ data-structures priority-queue alphabetical

您好,我正在解决某种排序算法问题。

我使用带有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

或者我可以通过使用less operator

来实现
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 个答案:

答案 0 :(得分:2)

无论如何,你不应该在实际代码中使用嵌套对来使用这种复杂的数据结构。它使代码难以理解。什么是pq.top().second.second.first

如果您的结构很复杂,那么定义一个具有所需成员的结构(但具有有意义的成员&#39;名称):

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...
    }
};