首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

C++ 容器選擇:vector<pair<int,int>> vs map<int,int> 核心區別與適用場景

     編輯:程式設計疑難解答

核心區別一覽表

特性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 典型用法

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<pair> 典型用法

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>。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved