根据条件 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
作为类型并传递特定类型,或者使用继承并让两个比较器都派生自公共基础。这两种方式都明显更冗长。
我正在尝试根据用户需求重新订购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
作为类型并传递特定类型,或者使用继承并让两个比较器都派生自公共基础。这两种方式都明显更冗长。