stack、queue、priority_queue 不提供迭代器,封裝底層容器(deque/vector/list)提供特定語義:
stack:LIFO,底層需 push_back/pop_back/back → vector/deque/list 皆可。queue:FIFO,底層需 push_back/pop_front/front/back → deque/list(vector 無 pop_front)。priority_queue:最大堆(默認),底層需隨機訪問迭代器 → vector/deque(list 不支持)。template <class T, class Container = deque<T> >
class stack {
Container c; // 底層容器
public:
bool empty() const { return c.empty(); }
size_type size() const { return c.size(); }
T& top() { return c.back(); }
const T& top() const { return c.back(); }
void push(const T& x) { c.push_back(x); }
void pop() { c.pop_back(); }
};
所有操作直接轉發到底層容器,零開銷抽象。
template <class T, class Container = deque<T> >
class queue {
Container c;
public:
T& front() { return c.front(); }
T& back() { return c.back(); }
void push(const T& x) { c.push_back(x); }
void pop() { c.pop_front(); } // 關鍵差異
};
template <class T, class Container = vector<T>, class Compare = less<T> >
class priority_queue {
Container c;
Compare comp; // 比較函數對象
public:
// 構造時 make_heap
template <class Iter>
priority_queue(Iter first, Iter last, const Compare& cmp = Compare())
: c(first, last), comp(cmp) {
make_heap(c.begin(), c.end(), comp);
}
void push(const T& x) {
c.push_back(x);
push_heap(c.begin(), c.end(), comp);
}
void pop() {
pop_heap(c.begin(), c.end(), comp);
c.pop_back();
}
const T& top() const { return c.front(); } // 堆頂
};
關鍵點:
less<T> → 最大堆(頂端最大)。greater<T> → 最小堆(頂端最小),需三參數聲明:priority_queue<int, vector<int>, greater<int>> q;make_heap/push_heap/pop_heap 維護堆性質。stack<int> s;
while (n) { s.push(n%2); n/=2; }
while (!s.empty()) { cout << s.top(); s.pop(); }
queue<TreeNode*> q; q.push(root);
while (!q.empty()) {
auto node = q.front(); q.pop();
// process
if (node->left) q.push(node->left);
if (node->right) q.push(node->right);
}
// 維護大小為 k 的最小堆,堆頂為第 k 大
priority_queue<int, vector<int>, greater<int>>> minHeap;
for (int x : nums) {
if (minHeap.size() < k) minHeap.push(x);
else if (x > minHeap.top()) { minHeap.pop(); minHeap.push(x); }
}
int a[] = {5,1,2,4,3};
make_heap(a, a+5, less<int>()); // 最大堆
// 輸出層序: 5 4 2 1 3 (非完全排序)
sort(a, a+5); // 或 sort_heap(a, a+5, less<int>())
// 輸出: 1 2 3 4 5
| 適配器 | 推薦底層 | 典型場景 |
|---|---|---|
| stack | vector (緊湊) | 表達式求值、DFS、回溯 |
| queue | deque (標準) | BFS、生產者消費者、滑動窗口 |
| priority_queue | vector (緊湊+隨機訪問) | Top K、任務調度、霍夫曼編碼、Dijkstra |