根据条件 c++ 重新排序 priority_queue

reordering priority_queue based on condition c++

我正在尝试根据用户需求重新订购priority_queue。

这是数据结构:

struct Person { 

    int age; 

    float height; 
};

我单独使用这个结构体以递减的方式重新排序

struct CompareHeight { 
    bool operator()(Person const& p1, Person const& p2) 
    { 
        // return "true" if "p1" is ordered  
        // before "p2", for example: 
        return p1.height > p2.height; 
    } 
} HI; 

并且我单独使用这个结构以递增的方式重新排序

struct CompareHeightInv { 
    bool operator()(Person const& p1, Person const& p2) 
    { 
        // return "true" if "p1" is ordered  
        // before "p2", for example: 
        return p1.height < p2.height; 
    } 
} HD; 

我通过以下方式给每个人打电话:

priority_queue<Person, vector<Person>, CompareHeightInv> inc; 

priority_queue<Person, vector<Person>, CompareHeight > dec; 

我的问题是:有没有这样的方法

class Foo {
private:
     ...
     priority_queue<Person, vector<Person>, something> myQueue; 
     ...
public:
     Foo (bool flag) {
          if (flag)
             myQueue is increasing
          else
             myQueue is deacreasing
     }

}

一种可能最简单的方法是将附加标志传递给比较器并且只有一个:

struct CompareHeight { 
    CompareHeight( bool asc ) : ascending( asc ) {}
    bool operator()(Person const& p1, Person const& p2) 
    { 
        if(ascending) return p1.height < p2.height; 
        return p1.height > p2.height; 
    } 
    bool ascending;
};

然后使用它:

CompareHeight comparator( str == "increasing" );
priority_queue<Person, vector<Person>, CompareHeight> queue( comparator );

或者只有一行:

priority_queue<Person, vector<Person>, CompareHeight> queue( CompareHeight( str == "increasing" ) );

否则,您可以使用 std::function 作为类型并传递特定类型,或者使用继承并让两个比较器都派生自公共基础。这两种方式都明显更冗长。