C++容器priority_queue

定义

一种特殊的队列,其中的元素并非按照“先进先出”(FIFO)的顺序排列,而是根据元素的优先级来决定出队顺序。优先级最高的元素总是位于队列的前端

  • 最大堆(默认)priority_queue 默认实现为一个最大堆(max-heap),即最大的元素(根据比较规则)拥有最高优先级,位于队首。
  • 堆结构:底层通常使用 std::vector 实现,并通过堆(通常是二叉堆)的性质来维护元素的顺序。
  • 访问限制:你只能访问和移除优先级最高的那个元素(队首)。不能遍历整个队列,也不能直接访问其他元素。
  • 动态大小:大小可以动态增长
  • 只能通过top函数获取元素

构造函数

1、默认构造函数

int main()
{
	system("chcp 65001");
	// 默认构造函数
	priority_queue<int> queue1;
	queue1.push(1);
	queue1.push(33);
	queue1.push(2);

	while (!queue1.empty())
	{
		cout << "queue1-> " << queue1.top() << endl;
		queue1.pop();
	}
}

2、带有比较函数的构造函数

int main()
{
	system("chcp 65001");
	// 带有自定义比较函数的构造函数
	std::priority_queue<int, std::vector<int>, std::greater<int>> queue1;
	queue1.push(1);
	queue1.push(33);
	queue1.push(2);

	while (!queue1.empty())
	{
		cout << "queue1-> " << queue1.top() << endl;
		queue1.pop();
	}
}

3、区间构造函数

int main()
{
	system("chcp 65001");
	// 区间构造函数
	std::vector<int> vec = { 3, 1, 4, 11, 5, 9 };
	std::priority_queue<int> queue1(vec.begin() + 1, vec.end() - 1);

	queue1.push(1);
	queue1.push(33);
	queue1.push(2);

	while (!queue1.empty())
	{
		cout << "queue1-> " << queue1.top() << endl;
		queue1.pop();
	}
}

4、组合构造函数

int main()
{
	system("chcp 65001");
	// 组合构造函数
	std::vector<int> vec = { 3, 1, 4, 11, 5, 9 };
	auto comp = [](int a, int b) { return a > b; };
	std::priority_queue<int, std::vector<int>, decltype(comp)> queue1(vec.begin(), vec.end(), comp);

	queue1.push(1);
	queue1.push(33);
	queue1.push(2);

	while (!queue1.empty())
	{
		cout << "queue1-> " << queue1.top() << endl;
		queue1.pop();
	}
}

5、拷贝构造函数

int main()
{
	system("chcp 65001");
	std::priority_queue<int> queue1;
	queue1.push(1);
	queue1.push(33);
	queue1.push(2);

	// 拷贝构造函数
	std::priority_queue<int> queue2(queue1);

	while (!queue2.empty())
	{
		cout << "queue1-> " << queue2.top() << endl;
		queue2.pop();
	}
}

6、移动构造函数

int main()
{
	system("chcp 65001");
	std::priority_queue<int> queue1;
	queue1.push(1);
	queue1.push(33);
	queue1.push(2);

	// 移动构造函数
	std::priority_queue<int> queue2(std::move(queue1));

	while (!queue2.empty())
	{
		cout << "queue1-> " << queue2.top() << endl;
		queue2.pop();
	}
}

常用函数

函数描述
push(value)将 value 插入优先队列。时间复杂度 O(log n)
emplace(args...)在容器内就地构造一个元素并插入。比 push 更高效,不用复制。O(log n)
pop()移除优先级最高的元素(队首元素)。时间复杂度 O(log n)
top()返回优先级最高元素(队首元素)的常量引用。时间复杂度 O(1。
empty()如果队列为空,返回 true。O(1)
size()返回队列中元素的数量。O(1)
swap(other)与另一个 priority_queue 交换内容。O(1)
int main()
{
	system("chcp 65001");
	std::priority_queue<int> queue1;
	queue1.push(1);
	queue1.push(33);
	queue1.push(2);
	queue1.emplace(15);
	cout << "queue1.size()-> " << queue1.size() << endl;
	cout << "queue1.empty()-> " << boolalpha << queue1.empty() << endl;
	while (!queue1.empty())
	{
		cout << "queue1-> " << queue1.top() << endl;
		queue1.pop();
	}
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值