?
C++ 標準模板庫(STL)中的容器分為序列式容器、關聯式容器和無序容器,各自適用于不同場景。以下是主要容器的應用場景及案例:
一、序列式容器
元素按插入順序存儲,支持線性訪問。
1.?vector
- 場景:動態數組,隨機訪問頻繁,尾部插入 / 刪除多。
- 特點:連續內存,自動擴容(倍增策略)。
- 案例:存儲用戶信息列表。
#include <vector>
#include <string>
using namespace std;vector<string> userNames;
userNames.push_back("Alice");
userNames.emplace_back("Bob"); // 直接構造對象
cout << userNames[0]; // 隨機訪問
2.?deque
- 場景:雙端隊列,頭尾插入 / 刪除頻繁。
- 特點:分段連續內存,支持
push_front()
。 - 案例:任務調度隊列。
#include <deque> deque<int> tasks; tasks.push_front(100); // 頭部插入 tasks.pop_back(); // 尾部刪除
????????????????????????????????
3.?list
- 場景:頻繁插入 / 刪除(任意位置),不關心隨機訪問。
- 特點:雙向鏈表,插入 / 刪除 O (1)。
- 案例:實現鏈表操作。
#include <list>
list<int> numbers = {1, 2, 3};
auto it = ++numbers.begin(); // 迭代器移動
numbers.insert(it, 10); // 在位置插入
4.?forward_list
- 場景:單向鏈表,僅需前向遍歷,節省空間。
- 特點:單鏈表,無
size()
,插入 / 刪除效率更高。 - 案例:實現輕量級鏈表。
#include <forward_list>
forward_list<int> flist = {1, 2};
flist.push_front(0); // 僅支持頭部操作
二、關聯式容器
元素按鍵排序,支持快速查找(基于紅黑樹)。
1.?set
- 場景:存儲唯一元素,自動排序,快速去重。
- 特點:鍵即值,不允許重復。
- 案例:存儲單詞集合。
#include <set>
set<string> words = {"apple", "banana"};
words.insert("apple"); // 重復元素被忽略
cout << words.count("apple"); // 輸出1
2.?map
- 場景:鍵值對映射,按鍵排序,查找高效。
- 特點:鍵唯一,基于紅黑樹。
- 案例:統計單詞頻率。
#include <map>
map<string, int> wordCount;
wordCount["hello"]++; // 自動插入并計數
cout << wordCount["hello"]; // 輸出1
3.?multiset
- 場景:允許重復元素的集合,按鍵排序。
- 案例:存儲考試分數(可重復)。
#include <multiset>
multiset<int> scores = {90, 85, 90};
cout << scores.count(90); // 輸出2
4.?multimap
- 場景:一鍵多值的映射,如用戶對應多個角色。
- 案例:員工部門關系。
#include <multimap>
multimap<string, string> empDept;
empDept.insert({"Alice", "HR"});
empDept.insert({"Alice", "IT"}); // 同一鍵可對應多個值
三、無序容器
基于哈希表,元素無序,查找效率更高(平均 O (1))。
1.?unordered_set
- 場景:快速查找、去重,不關心順序。
- 案例:檢查元素是否存在。
#include <unordered_set>
unordered_set<int> ids = {101, 202};
if (ids.find(101) != ids.end()) { /* 存在 */ }
2.?unordered_map
- 場景:鍵值對快速查找,如緩存、字典。
- 案例:實現 URL 映射。
#include <unordered_map>
unordered_map<string, string> urlMap;
urlMap["/home"] = "index.html";
cout << urlMap["/home"]; // 快速查找
3.?unordered_multiset
?和?unordered_multimap
- 場景:類似
multiset
和multimap
,但無序。 - 案例:存儲社交網絡中的多對多關系。
四、容器適配器
基于現有容器實現特定功能。
1.?stack
- 場景:后進先出(LIFO),如表達式求值、遞歸模擬。
- 案例:括號匹配檢查。
#include <stack>
stack<char> brackets;
for (char c : "({})") {if (c == '(') brackets.push(c);// ... 其他匹配邏輯
}
2.?queue
- 場景:先進先出(FIFO),如消息隊列。
- 案例:廣度優先搜索(BFS)。
#include <queue>
queue<int> q;
q.push(1);
int front = q.front(); // 訪問隊首
q.pop(); // 出隊
3.?priority_queue
- 場景:元素按優先級出隊(默認大頂堆)。
- 案例:任務調度(優先級高的先執行)。
#include <queue>
priority_queue<int> pq; // 大頂堆
pq.push(3);
pq.push(1);
cout << pq.top(); // 輸出3
選擇容器的建議
- 隨機訪問:
vector
、deque
。 - 中間插入 / 刪除:
list
。 - 鍵值對存儲:
map
(有序)或unordered_map
(快速查找)。 - 去重 + 排序:
set
。 - 高效插入 / 刪除:鏈表類容器(
list
、forward_list
)。 - 固定大小:
array
(C++11,靜態數組,性能略優)。
根據訪問模式和操作頻率選擇合適的容器,可顯著提升程序性能。