前言:
我们遍历容器时,一般可以采用
- 迭代器
- 控制变量i < size
- 判empty()
但是,如果采用第二种方式遍历c++ priority_queue时,会出现无法遍历完整的问题。
代码:
参考如下代码。该代码实现数组A与B的合并,采用priority_queue的堆排序实现。在将排序后数据从priority_queue重新拷贝到数组A中时,会发现只会遍历一次的错误。
#include <bits/stdc++.h>
using namespace std;
void merge(int A[], int m, int B[], int n) {
priority_queue<int, vector<int>, greater<int>> pq;
for(int i = 0; i < m; i++){
pq.push(A[i]);
}
for(int i = 0; i < n; i++){
pq.push(B[i]);
}
for(int i = 0; i < pq.size(); i++){ // 这里只会遍历一次
A[i] = pq.top();
pq.pop();
}
}
int main()
{
int A[] = {1, 0};
int m = 1;
int B[] = {2};
int n = 1;
merge(A, m, B, n);
return 0;
}
误区:
- 因为pq.pop()后,pq.size()-1。下次遍历时,和i比的就不是上次的size了,而是上次的size-1。