为什么 STL 中的 priority_queue 不遵循严格的弱排序?
Why does priority_queue in STL not follow strict weak ordering?
我一直在研究 STL 容器和它们支持的比较 function/functors,但是我发现 priority_queue 不遵循通常的严格弱排序,我试图了解可能是什么原因但无法弄清楚,任何指针都会有所帮助。
这篇博客中还提到 priority_queue 不遵循严格的弱排序。 enter link description here
#include "STL.h"
#include "queue"
#include "vector"
#include "iostream"
#include "functional"
using namespace std;
typedef bool(*func)(const int& val1 , const int& val2);
bool strict_weak_order_function(const int& val1 , const int& val2){
return val1 > val2;
}
bool comparer_function(const int& val1 , const int& val2){
return !strict_weak_order_function(val1 , val2);
}
struct Compaper_functor{
bool operator()(const int& val1 , const int& val2){
return !strict_weak_order_function(val1 , val2);
}
};
void runPriorityQueue(void){
//priority_queue<int , vector<int> , func > pq(comparer_function);
priority_queue<int , vector<int> , Compaper_functor > pq;
int size;
cin >> size;
while(size--){
int val;
cin >> val;
pq.push(val);
}
while(!pq.empty()){
cout <<'\n'<< pq.top() << '\n';
pq.pop();
}
}
问题是您的 strict_weak_order
(使用 >
)的否定是 <=
,这不是严格的弱顺序。严格的弱顺序 R
必须满足所有 x
的 x R x == false
。但是,R
等于 <=
会产生 (x <= x) == true
.
您需要颠倒参数的顺序(对应于 <
)。
bool comparer_function(const int& val1 , const int& val2){
return strict_weak_order_function(val2 , val1);
}
struct Compaper_functor{
bool operator()(const int& val1 , const int& val2){
return strict_weak_order_function(val2 , val1);
}
};
但是请注意,std::priority_queue
有一个 std::less
作为默认比较器,但是 (即来自同一输入的 [5, 4, 3, 2, 1]
输出),所以要获得最小值-堆(即输入 [5, 4, 3, 2, 1]
的输出 [1, 2, 3, 4, 5]
)你需要传递 std::greater
,参见例如这个:
#include <queue>
#include <iostream>
int main()
{
auto const v = std::vector<int> { 5, 4, 3, 2, 1 };
// prints 5 through 1
for (auto p = std::priority_queue<int> { v.begin(), v.end() }; !p.empty(); p.pop())
std::cout << p.top() << ',';
std::cout << '\n';
// prints 1 through 5
for (auto p = std::priority_queue<int, std::vector<int>, std::greater<int>> { v.begin(), v.end() }; !p.empty(); p.pop())
std::cout << p.top() << ',';
std::cout << '\n';
}
我一直在研究 STL 容器和它们支持的比较 function/functors,但是我发现 priority_queue 不遵循通常的严格弱排序,我试图了解可能是什么原因但无法弄清楚,任何指针都会有所帮助。
这篇博客中还提到 priority_queue 不遵循严格的弱排序。 enter link description here
#include "STL.h"
#include "queue"
#include "vector"
#include "iostream"
#include "functional"
using namespace std;
typedef bool(*func)(const int& val1 , const int& val2);
bool strict_weak_order_function(const int& val1 , const int& val2){
return val1 > val2;
}
bool comparer_function(const int& val1 , const int& val2){
return !strict_weak_order_function(val1 , val2);
}
struct Compaper_functor{
bool operator()(const int& val1 , const int& val2){
return !strict_weak_order_function(val1 , val2);
}
};
void runPriorityQueue(void){
//priority_queue<int , vector<int> , func > pq(comparer_function);
priority_queue<int , vector<int> , Compaper_functor > pq;
int size;
cin >> size;
while(size--){
int val;
cin >> val;
pq.push(val);
}
while(!pq.empty()){
cout <<'\n'<< pq.top() << '\n';
pq.pop();
}
}
问题是您的 strict_weak_order
(使用 >
)的否定是 <=
,这不是严格的弱顺序。严格的弱顺序 R
必须满足所有 x
的 x R x == false
。但是,R
等于 <=
会产生 (x <= x) == true
.
您需要颠倒参数的顺序(对应于 <
)。
bool comparer_function(const int& val1 , const int& val2){
return strict_weak_order_function(val2 , val1);
}
struct Compaper_functor{
bool operator()(const int& val1 , const int& val2){
return strict_weak_order_function(val2 , val1);
}
};
但是请注意,std::priority_queue
有一个 std::less
作为默认比较器,但是 [5, 4, 3, 2, 1]
输出),所以要获得最小值-堆(即输入 [5, 4, 3, 2, 1]
的输出 [1, 2, 3, 4, 5]
)你需要传递 std::greater
,参见例如这个:
#include <queue>
#include <iostream>
int main()
{
auto const v = std::vector<int> { 5, 4, 3, 2, 1 };
// prints 5 through 1
for (auto p = std::priority_queue<int> { v.begin(), v.end() }; !p.empty(); p.pop())
std::cout << p.top() << ',';
std::cout << '\n';
// prints 1 through 5
for (auto p = std::priority_queue<int, std::vector<int>, std::greater<int>> { v.begin(), v.end() }; !p.empty(); p.pop())
std::cout << p.top() << ',';
std::cout << '\n';
}