首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >构建对的priority_queue

构建对的priority_queue
EN

Stack Overflow用户
提问于 2022-03-02 05:46:11
回答 1查看 119关注 0票数 0

我经常遇到这样的问题:需要一个存储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]

我最终想出了如何得到我想要的东西,但总是很混乱。我将在下面提供一些例子。

我可以尝试这样的方法:

代码语言:javascript
复制
#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),并允许编译器推导出比较器类型。这将导致编译器抛出一个错误,我不知道原因。为了完整性,错误是

代码语言:javascript
复制
cannot convert argument 1 from 'main::<lambda_1>' to 'const _Pr &'
with _Pr=std::less<SomeKindOfPair>

这就是我开始工作的地方。正如你所看到的,它是混乱的:

代码语言:javascript
复制
#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;
}

有更好的方法吗?具体地说:

  1. 我可以在不定义MyComparer类的情况下这样做吗?
  2. 我可以这样做,而不必写出priority_queuestd::priority_queue<SomeKindOfPair, std::vector<SomeKindOfPair>, MyComparer>的完全模板专门化。
  3. 我可以这样做,而不必在任何地方命名比较操作符(将其定义为构建priority_queue的lambda )吗?

而且,更重要的是

  1. 因为大多数在线评审员仍然使用C++标准的旧版本,所以我能以一种与较早的C++标准(特别是C++14)兼容的方式来实现吗?
  2. 如果这样做会在适用的情况下禁用概念的使用,那么我可以不使用decltype吗?
EN

回答 1

Stack Overflow用户

发布于 2022-03-02 06:19:20

您可以将第一种形式的扣减指南用于std::priority_queue

代码语言:javascript
复制
template <class Comp, class Container>
priority_queue(Comp, Container)
 -> priority_queue<typename Container::value_type, Container, Comp>;

然后

代码语言:javascript
复制
std::vector<SomeKindOfPair> v;
std::priority_queue my_queue(
  [](const auto& a, const auto& b) {return a.ordered_element > b.ordered_element; }, v);

演示

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71317967

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档