C++ map容器插入操作方式詳解
更新時間:2025年05月19日 10:20:52 作者:苕皮藍牙土豆
map是C++ STL中的關聯(lián)容器,存儲鍵值對(key-value pairs),下面給大家介紹C++ map容器插入操作方式,感興趣的朋友一起看看吧
1. map插入操作基礎
map
是C++ STL中的關聯(lián)容器,存儲鍵值對(key-value pairs)。插入元素時有四種主要方式,各有特點:
1.1 頭文件與聲明
#include <map> using namespace std; map<int, string> mapStu; // 鍵為int,值為string
2. 四種插入方式詳解
2.1 方式一:構造pair后插入
pair<map<int, string>::iterator, bool> ret = mapStu.insert(pair<int, string>(1, "張三"));
特點:
- 顯式構造
pair
對象 insert
返回一個pair<iterator, bool>
first
:指向插入元素的迭代器second
:是否插入成功(bool)
示例判斷:
if (ret.second == true) { cout << "插入成功!value:" << (*(ret.first)).second << endl; } else { cout << "插入失敗!" << endl; // 鍵已存在時會失敗 }
注意:對于map
,如果鍵已存在,插入會失敗,不會覆蓋原有值。
2.2 方式二:使用make_pair
mapStu.insert(make_pair(2, "李四"));
優(yōu)點:
- 語法更簡潔,無需顯式指定模板參數(shù)
- 自動推導pair類型
- 同樣返回
pair<iterator, bool>
2.3 方式三:使用value_type
mapStu.insert(map<int, string>::value_type(3, "王五"));
特點:
value_type
是map內部定義的typedef,等同于pair<const Key, T>
- 類型安全,確保鍵的類型正確
- 同樣返回
pair<iterator, bool>
2.4 方式四:使用[]操作符
mapStu[4] = "趙六"; // 插入 mapStu[4] = "小趙六"; // 修改
關鍵特性:
- 查找+插入/修改:先查找鍵是否存在,不存在則插入,存在則修改
- 可能意外插入:訪問不存在的鍵時會自動插入
string strName = mapStu[8]; // 鍵8不存在時會自動插入
返回值:返回值的引用,可直接修改
特殊用法:
mapStu[6] = mapStu[5]; // 復制鍵5的值到鍵6 mapStu[7] = mapStu[4]; // 復制鍵4的值到鍵7
3. 四種方式對比
特性 | 方式一(pair) | 方式二(make_pair) | 方式三(value_type) | 方式四([]) |
---|---|---|---|---|
語法復雜度 | 高 | 中 | 高 | 低 |
返回值 | pair<iter,bool> | pair<iter,bool> | pair<iter,bool> | 值引用 |
鍵存在時的行為 | 不覆蓋 | 不覆蓋 | 不覆蓋 | 覆蓋 |
可能意外插入 | 否 | 否 | 否 | 是 |
類型安全性 | 高 | 中 | 最高 | 低 |
性能 | 中等 | 中等 | 中等 | 稍快 |
4. 遍歷map內容
for (map<int, string>::iterator it = mapStu.begin(); it != mapStu.end(); it++) { cout << it->first << ", " << it->second << endl; }
或使用C++11范圍for循環(huán):
for (const auto& pair : mapStu) { cout << pair.first << ", " << pair.second << endl; }
5. 關鍵注意事項
- 鍵的唯一性:
map
中每個鍵只能出現(xiàn)一次,重復插入會失敗 - 自動排序:元素按鍵的升序自動排列
- []操作符的風險:
- 可能意外插入新元素
- 訪問不存在的鍵時會用默認值創(chuàng)建新元素
- 性能考慮:
- 插入操作平均時間復雜度O(log n)
- 對于已知不存在的鍵,使用
insert
比[]
更高效
6. 實際應用建議
- 需要知道是否插入成功:使用
insert
+檢查返回值 - 需要覆蓋現(xiàn)有值:使用
[]
操作符 - 避免意外插入:先用
find
檢查鍵是否存在 - 代碼簡潔性:優(yōu)先考慮
make_pair
或emplace
(C++11)
7. 完整代碼回顧
#include <map> #include <iostream> using namespace std; int main() { map<int, string> mapStu; // 方式一 auto ret = mapStu.insert(pair<int, string>(1, "張三")); if (ret.second) { cout << "插入成功!value:" << ret.first->second << endl; } else { cout << "插入失敗!" << endl; } // 重復插入測試 ret = mapStu.insert(pair<int, string>(1, "小張三")); if (!ret.second) { cout << "插入小張三失敗!" << endl; } // 方式二 mapStu.insert(make_pair(2, "李四")); // 方式三 mapStu.insert(map<int, string>::value_type(3, "王五")); // 方式四 mapStu[4] = "趙六"; mapStu[4] = "小趙六"; // 覆蓋 // 特殊用法 mapStu[6] = mapStu[5]; // 復制 mapStu[7] = mapStu[4]; // 復制 // 遍歷輸出 for (const auto& pair : mapStu) { cout << pair.first << ", " << pair.second << endl; } system("pause"); return 0; }
8. 擴展知識
8.1 C++11的emplace
C++11引入了更高效的emplace
方法:
mapStu.emplace(5, "錢七"); // 直接在容器內構造元素,避免臨時對象
8.2 異常安全性
insert
和emplace
提供強異常保證:如果插入失敗,容器保持不變。
8.3 性能優(yōu)化
對于大批量插入:
如果鍵已知有序,可以使用提示位置插入:
mapStu.insert(hint_iterator, make_pair(10, "孫八"));
或者先構建vector再批量插入
到此這篇關于C++ map容器: 插入操作的文章就介紹到這了,更多相關C++ map容器插入內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!