std::queue用法

本文深入探讨了STL中的队列(queue)和优先队列(priority_queue)的使用方法,通过实例展示了如何实现0到9的数字入队、出队及优先队列的优先级出队操作。

int main(int argc, char *argv[])

{  

queue<int> myQ;  

for(int i=0; i<10; i++)  

myQ.push(i);  

for(int i=0; i<myQ.size(); i++)  

{  

cout << myQ.front()<<endl;  

myQ.pop();  

}  

return 0;}

queue是STL的队列,有FIFO的特性。上面的程序是将0~9十个数字压入队列,然后依次出对queue的成员方法比较少,常用的也就那么几个,注意,要包含头文件<queue>对于priority_queue,他的原则是优先权大的先出队,也就是说,你在创建一个priority_queue的时候是可以指定每个元素的优先级的,优先级越大,出队越早,而queue只是传统意义上简单的队列。

### 特性 `std::priority_queue` 是 C++ 标准库中的一个容器适配器,它提供了一种基于堆(heap)的数据结构来管理元素。其主要特性包括: - **最大堆默认实现**:默认情况下,`std::priority_queue` 使用 `std::vector` 作为底层容器,并通过 `std::less<T>` 作为比较函数,使得队列顶部始终是最大的元素[^2]。 - **元素插入与删除**:插入元素的时间复杂度为 O(log n),而获取顶部元素的时间复杂度为 O(1)。删除顶部元素的时间复杂度为 O(log n)[^2]。 - **不可遍历**:与标准容器不同,`std::priority_queue` 不支持迭代器,因此不能直接遍历其内部元素。只能通过插入 (`push`) 和删除 (`pop`) 操作来修改队列内容[^2]。 - **自定义比较函数**:可以通过提供自定义的比较函数来改变堆的行为,例如实现最小堆或特定类型的优先级排序[^2]。 ### 使用方法 #### 基本使用 ```cpp #include <iostream> #include <queue> int main() { // 创建一个最大堆 std::priority_queue<int> max_heap; max_heap.push(10); max_heap.push(30); max_heap.push(20); std::cout << "Top element: " << max_heap.top() << std::endl; // 输出 30 max_heap.pop(); std::cout << "Top element after pop: " << max_heap.top() << std::endl; // 输出 20 } ``` #### 自定义比较函数 如果需要实现最小堆,可以通过提供自定义的比较函数来改变堆的行为: ```cpp #include <iostream> #include <queue> struct compare { bool operator()(const int& a, const int& b) { return a > b; // 最小堆 } }; int main() { // 创建一个最小堆 std::priority_queue<int, std::vector<int>, compare> min_heap; min_heap.push(10); min_heap.push(30); min_heap.push(20); std::cout << "Top element: " << min_heap.top() << std::endl; // 输出 10 min_heap.pop(); std::cout << "Top element after pop: " << min_heap.top() << std::endl; // 输出 20 } ``` #### 使用自定义类型 当使用自定义类型时,需要确保比较函数能够正确地比较这些类型的实例: ```cpp #include <iostream> #include <queue> #include <string> struct Task { int priority; std::string description; // 重载小于运算符以支持默认比较 bool operator<(const Task& other) const { return priority < other.priority; } }; int main() { std::priority_queue<Task> task_queue; task_queue.push({1, "Low priority task"}); task_queue.push({3, "High priority task"}); task_queue.push({2, "Medium priority task"}); while (!task_queue.empty()) { Task t = task_queue.top(); std::cout << t.description << " (Priority: " << t.priority << ")" << std::endl; task_queue.pop(); } } ``` ### 注意事项 - **底层容器**:`std::priority_queue` 默认使用 `std::vector` 作为底层容器,但也可以指定其他容器如 `std::deque` 或 `std::list`,不过 `std::vector` 通常是最佳选择[^2]。 - **性能考虑**:由于每次插入和删除操作都需要维护堆的性质,因此在大量数据操作时需要注意性能影响。 - **线程安全**:`std::priority_queue` 本身不是线程安全的,如果在多线程环境中使用,需要额外的同步机制来保证数据一致性[^1]。 - **适用场景**:适用于需要频繁访问最大或最小元素的场景,例如任务调度、事件驱动系统等[^1]。 通过上述示例和特性描述,可以更好地理解和使用 `std::priority_queue` 来解决实际问题。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值