C++容器priority_queue
C++容器priority_queue
- 定义
- 构造函数
- 1、默认构造函数
- 2、带有比较函数的构造函数
- 3、区间构造函数
- 4、组合构造函数
- 5、拷贝构造函数
- 6、移动构造函数
- 常用函数
定义
一种特殊的队列,其中的元素并非按照“先进先出”(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();}
}
