根据条件重新排序优先级_queue c++。

问题描述 投票:0回答:1

我试图根据用户的需求重新排列优先级_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; 

和我叫每一个speratlly由。

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
     }

}
c++ pointers struct priority-queue
1个回答
1
投票

其中一个方法可能也是最简单的方法,就是给你的比较器传递额外的标志,只有一个。

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 作为一个类型,并传递特定的类型,或者使用继承,并让两个比较器都从共同的基础上导出。这两种方式都明显比较啰嗦。

© www.soinside.com 2019 - 2024. All rights reserved.