我经常遇到这样的问题:需要一个存储std::pair<int, T>、std::tuple<int, T>或std::array<int, 2>的优先级队列,其中元素是通过对的第一个条目排序的。
例如,将条目[4, 2]、[2, 4]、[1, 1]和[3, 3]排序为:
[1, 1] < [2, 4] < [3, 3] < [4, 2]。
我最终想出了如何得到我想要的东西,但总是很混乱。我将在下面提供一些例子。
我可以尝试这样的方法:
#include <queue>
struct SomeKindOfPair {
int ordered_element;
int unordered_element;
};
int main() {
std::priority_queue<SomeKindOfPair> my_queue([](SomeKindOfPair a, SomeKindOfPair b) {return a.ordered_element > b.ordered_element; });
return 0;
}我在这里的目的是使用来自这里的构造函数(2),并允许编译器推导出比较器类型。这将导致编译器抛出一个错误,我不知道原因。为了完整性,错误是
cannot convert argument 1 from 'main::<lambda_1>' to 'const _Pr &'
with _Pr=std::less<SomeKindOfPair>这就是我开始工作的地方。正如你所看到的,它是混乱的:
#include <queue>
struct SomeKindOfPair {
int ordered_element;
int unordered_element;
};
class MyComparer {
public:
bool operator()(SomeKindOfPair a, SomeKindOfPair b) {
return a.ordered_element > b.ordered_element;
}
};
int main() {
MyComparer comparer{};
std::priority_queue<SomeKindOfPair, std::vector<SomeKindOfPair>, MyComparer> my_queue{ comparer };
return 0;
}有更好的方法吗?具体地说:
MyComparer类的情况下这样做吗?priority_queue,std::priority_queue<SomeKindOfPair, std::vector<SomeKindOfPair>, MyComparer>的完全模板专门化。priority_queue的lambda )吗?而且,更重要的是
decltype吗?发布于 2022-03-02 06:19:20
您可以将第一种形式的扣减指南用于std::priority_queue
template <class Comp, class Container>
priority_queue(Comp, Container)
-> priority_queue<typename Container::value_type, Container, Comp>;然后
std::vector<SomeKindOfPair> v;
std::priority_queue my_queue(
[](const auto& a, const auto& b) {return a.ordered_element > b.ordered_element; }, v);https://stackoverflow.com/questions/71317967
复制相似问题