容器库(16)-std::priority_queue

std::priority_queue是一种容器适配器,它内部的元素是按顺序排列的,默认情况下最大元素总是在队列顶部。可以自定义Compare来改变元素的排列顺序。

template<
    class T,
    class Container = std::vector<T>,
    class Compare = std::less<typename Container::value_type>
> class priority_queue;

本文章的代码库:

https://gitee.com/gamestorm577/CppStd

成员函数

构造、析构和赋值

构造函数

可以构造一个空的priority_queue,也可以用对应的容器或者另一个priority_queue来构造一个priority_queue。代码示例:

std::vector<int> tmp{1, 2, 3};

std::priority_queue<int, std::vector<int>> pq1;
std::priority_queue<int, std::vector<int>> pq2(std::less<int>(), tmp);
std::priority_queue<int, std::vector<int>> pq3(pq2);

std::cout << "pq1 size = " << pq1.size() << std::endl;
std::cout << "pq2 size = " << pq2.size() << std::endl;
std::cout << "pq3 size = " << pq3.size() << std::endl;

输出结果:

pq1 size = 0
pq2 size = 3
pq3 size = 3

析构函数

销毁priority_queue时,会调用各元素的析构函数。代码示例:

struct MyStruct
{
    MyStruct(int i)
        : Num(i)
    {
    }

    ~MyStruct()
    {
        std::cout << "~MyStruct: " << Num << std::endl;
    }

    int Num = 0;
};

auto comp = [](const MyStruct& lhs, const MyStruct& rhs) -> bool
{
    return lhs.Num < rhs.Num;
};

std::vector<MyStruct> tmp{1, 2, 3};
std::priority_queue<MyStruct, std::vector<MyStruct>, decltype(comp)> pq(
    comp, std::move(tmp));
std::cout << "end\n";

输出结果:

~MyStruct: 3
~MyStruct: 2
~MyStruct: 1
~MyStruct: 1
end
~MyStruct: 3
~MyStruct: 2
~MyStruct: 1

赋值函数

可以用另一个priority_queue给priority_queue赋值。代码示例:

std::vector<int> tmp{1, 2, 3};
std::priority_queue<int, std::vector<int>> pq1(std::less<int>(), tmp);
std::priority_queue<int, std::vector<int>> pq2;

pq2 = pq1;
std::cout << "pq2 size = " << pq2.size() << std::endl;

输出结果:

pq2 size = 3

元素访问

top

获取队列顶部元素的const引用。代码示例:

std::vector<int> tmp{3, 1, 2};
std::priority_queue<int, std::vector<int>> pq(std::less<int>(), tmp);
std::cout << "pq top: " << pq.top() << std::endl;

输出结果:

pq top: 3

容量

empty

检查priority_queue是否为空。代码示例:

std::vector<int> tmp{1, 2, 3};
std::priority_queue<int, std::vector<int>> pq1(std::less<int>(), tmp);
std::priority_queue<int, std::vector<int>> pq2;
std::cout << std::boolalpha;
std::cout << "pq1 empty: " << pq1.empty() << std::endl;
std::cout << "pq2 empty: " << pq2.empty() << std::endl;

输出结果:

pq1 empty: false
pq2 empty: true

size

返回priority_queue中元素的个数。代码示例:

std::vector<int> tmp{1, 2, 3};
std::priority_queue<int, std::vector<int>> pq1(std::less<int>(), tmp);
std::priority_queue<int, std::vector<int>> pq2;
std::cout << "pq1 size: " << pq1.size() << std::endl;
std::cout << "pq2 size: " << pq2.size() << std::endl;

输出结果:

pq1 size: 3
pq2 size: 0

修改器

push

插入元素到priority_queue中并对元素进行排序。代码示例:

std::priority_queue<int, std::vector<int>> s;
s.push(3);
s.push(4);
s.push(1);
s.push(2);
std::cout << "s top: " << s.top() << std::endl;

输出结果:

s top: 4

emplace

构造一个元素到priority_queue中并对元素进行排序。代码示例:

struct MyStruct
{
    MyStruct(int i)
    {
        std::cout << "MyStruct: " << i << std::endl;
    }
};

auto comp = [](const MyStruct& lhs, const MyStruct& rhs) -> bool
{
    return true;
};

std::priority_queue<MyStruct, std::vector<MyStruct>, decltype(comp)> pq;
pq.emplace(1);
pq.emplace(2);
pq.emplace(3);

输出结果:

MyStruct: 1
MyStruct: 2
MyStruct: 3

pop

移除队列的首个元素。代码示例:

std::priority_queue<int, std::vector<int>> s;
s.push(4);
s.push(1);
s.push(3);
s.push(2);

while (!s.empty())
{
    std::cout << "num: " << s.top() << std::endl;
    s.pop();
}

输出结果:

num: 4
num: 3
num: 2
num: 1

swap

和另一个priority_queue交换元素内容。代码示例:

std::vector<int> tmp1{1, 2, 3};
std::vector<int> tmp2{1, 2};
std::priority_queue<int, std::vector<int>> pq1(std::less<int>(), tmp1);
std::priority_queue<int, std::vector<int>> pq2(std::less<int>(), tmp2);
pq1.swap(pq2);
std::cout << "pq1 size = " << pq1.size() << std::endl;
std::cout << "pq2 size = " << pq2.size() << std::endl;

输出结果:

pq1 size = 2
pq2 size = 3

非成员函数

swap

交换两个priority_queue的元素内容。代码示例:

std::vector<int> tmp1{1, 2, 3};
std::vector<int> tmp2{1, 2};
std::priority_queue<int, std::vector<int>> pq1(std::less<int>(), tmp1);
std::priority_queue<int, std::vector<int>> pq2(std::less<int>(), tmp2);
std::swap(pq1, pq2);
std::cout << "pq1 size = " << pq1.size() << std::endl;
std::cout << "pq2 size = " << pq2.size() << std::endl;

输出结果:

pq1 size = 2
pq2 size = 3

  • 9
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
`std::priority_queue` 类有几个不同的构造函数,可以根据需要选择不同的方式来创建优先队列。下面是一些常用的构造函数: 1. 默认构造函数: ```cpp std::priority_queue<T> pq; ``` 这将创建一个空的优先队列,其中元素类型为 `T`,使用默认的比较函数 `std::less<T>` 进行元素比较。 2. 指定比较函数的构造函数: ```cpp std::priority_queue<T, Container, Compare> pq; ``` 这将创建一个空的优先队列,其中元素类型为 `T`,使用指定的比较函数 `Compare` 进行元素比较。`Container` 是一个可选的容器类型,默认为 `std::vector<T>`。 3. 使用范围构造函数: ```cpp template <class InputIterator> std::priority_queue(InputIterator first, InputIterator last); ``` 这将创建一个优先队列,并使用迭代器范围 `[first, last)` 中的元素进行初始化。这意味着可以通过提供一个容器的起始和结束迭代器来构造优先队列。 以下是一些使用示例: ```cpp std::priority_queue<int> pq1; // 默认构造函数,元素类型为 int std::priority_queue<int, std::vector<int>, std::greater<int>> pq2; // 元素类型为 int,按照从小到大排序 std::priority_queue<double, std::deque<double>> pq3; // 元素类型为 double,使用 std::deque 作为容器 std::vector<int> nums = {3, 1, 4, 1, 5}; std::priority_queue<int> pq4(nums.begin(), nums.end()); // 使用范围构造函数初始化优先队列 ``` 希望这些构造函数的说明对你有所帮助!如果还有其他问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值