| 特性 | vector<pair<int,int>> | map<int,int> |
|---|---|---|
| 底層結構 | 動態數組(連續內存) | 紅黑樹(平衡二叉搜索樹) |
| 鍵值關係 | 允許重複鍵,順序由插入決定 | 鍵唯一,自動按鍵排序 |
| 查找鍵 | O(n) 線性遍歷 | O(log n) 二分查找 |
| 插入/刪除 | 尾部 O(1),中間 O(n) | O(log n) |
| 遍歷順序 | 插入順序 | 鍵升序 |
| 內存佔用 | 緊湊,無額外指針 | 每節點含指針/顏色,開銷大 |
| 隨機訪問 | 支持 v[i] O(1) | 不支持 |
map<int,int> 的場景key 存在性判斷:if (m.count(id))。m[key] = value 若 key 不存在自動插入默認值 0。vector<pair<int,int>> 的場景sort 按 first/second 排序。v[5] 直接獲取第 6 個元素。map scoreMap;
scoreMap[1001] = 95; // 自動插入
scoreMap[1002] = 88;
scoreMap[1001] = 96; // 覆蓋更新
// 查找
auto it = scoreMap.find(1001);
if (it != scoreMap.end()) cout << it->second; // 96
// 遍歷(按學號升序)
for (auto& p : scoreMap)
cout << p.first << ": " << p.second << endl;
vector> logs;
logs.emplace_back(1001, 95);
logs.emplace_back(1002, 88);
logs.emplace_back(1001, 96); // 允許重複鍵
// 按分數降序排序
sort(logs.begin(), logs.end(),
[](auto& a, auto& b) { return a.second > b.second; });
// 遍歷
for (auto& p : logs)
cout << p.first << ": " << p.second << endl;
若需既保持插入順序,又支持快速查找,可雙結構同步維護:
vector> order; // 保持順序
map index; // 快速查找
void insert(int k, int v) {
order.emplace_back(k, v);
index[k] = v; // 覆蓋舊值
}
或使用 boost::multi_index、C++23 std::flat_map(有序向量)等進階容器。
「針對按鍵查找/唯一鍵/自動排序需求,直接用 map 更好。」 —— 最佳回答精髓
若無上述需求,vector<pair> 更輕量高效。實際開發中 map/unordered_map 使用頻率遠高於 vector<pair>。