C++ map插入方式詳解及find使用方法
1. map的四種插入方式
在C++中,std::map 提供了多種插入元素的方式。以下是四種常用的插入方法:
1.1 使用下標(biāo)運(yùn)算符[](最簡(jiǎn)單)
map1[0] = student(101, "j");
特點(diǎn):
- 語(yǔ)法最簡(jiǎn)潔直觀
- 如果鍵不存在,會(huì)先創(chuàng)建該鍵,然后賦值
- 如果鍵已存在,會(huì)覆蓋原有的值
- 需要結(jié)構(gòu)體有默認(rèn)構(gòu)造函數(shù)(因?yàn)闀?huì)先創(chuàng)建默認(rèn)對(duì)象再賦值)
1.2 使用emplace(C++11推薦)
map1.emplace(60, student(222, "d"));
特點(diǎn):
- C++11引入的高效插入方式
- 直接在map內(nèi)部構(gòu)造元素,避免臨時(shí)對(duì)象的創(chuàng)建和拷貝
- 如果鍵已存在,不會(huì)插入新元素
- 返回一個(gè)pair,first是迭代器,second是bool表示是否插入成功
1.3 使用insert和初始化列表(最易懂)
map1.insert({900, student(500, "rr")});
特點(diǎn):
- 使用初始化列表語(yǔ)法,代碼清晰易讀
- 如果鍵已存在,不會(huì)插入新元素
- 返回一個(gè)pair,first是迭代器,second是bool表示是否插入成功
1.4 使用insert和pair(最詳細(xì)但啰嗦)
map1.insert(pair<int, student>(70, student(2000, "bad")));
特點(diǎn):
- 顯式指定pair類型,代碼最詳細(xì)
- 如果鍵已存在,不會(huì)插入新元素
- 可以使用
make_pair簡(jiǎn)化:map1.insert(make_pair(70, student(2000, "bad")));
2. find的使用方法
find 方法用于在map中查找指定鍵的元素:
2.1 基本用法
// 查找鍵為50的元素
auto it = map1.find(50);
if (it != map1.end()) {
// 找到了,可以訪問元素
cout << "找到元素: " << it->second.name << endl;
} else {
// 沒找到
cout << "未找到鍵為50的元素" << endl;
}
2.2 查找并修改
auto it = map1.find(100);
if (it != map1.end()) {
// 修改找到的元素
it->second.name = "修改后的名字";
it->second.scor = 9999;
}
2.3 查找并刪除
auto it = map1.find(60);
if (it != map1.end()) {
map1.erase(it); // 刪除找到的元素
}
3. 結(jié)構(gòu)體需要無(wú)參構(gòu)造函數(shù)的原因
當(dāng)map的值為結(jié)構(gòu)體時(shí),結(jié)構(gòu)體必須有無(wú)參構(gòu)造函數(shù),原因如下:
3.1 下標(biāo)運(yùn)算符[]的要求
map1[0] = student(101, "j");
這行代碼實(shí)際上執(zhí)行了兩個(gè)步驟:
map1[0]- 如果鍵0不存在,會(huì)創(chuàng)建一個(gè)默認(rèn)構(gòu)造的student對(duì)象= student(101, "j")- 然后將這個(gè)默認(rèn)對(duì)象替換為新對(duì)象
如果沒有無(wú)參構(gòu)造函數(shù),第一步就會(huì)失敗。
3.2 結(jié)構(gòu)體定義示例
struct student {
int scor;
string name;
// 必須有無(wú)參構(gòu)造函數(shù)
student() {
scor = 0;
name = "";
};
// 帶參數(shù)的構(gòu)造函數(shù)
student(int scor0, string name0) {
scor = scor0;
name = name0;
};
};
3.3 替代方案
如果不想提供無(wú)參構(gòu)造函數(shù),可以使用以下插入方式:
// 使用insert或emplace,避免使用[]
map1.insert({0, student(101, "j")});
map1.emplace(0, student(101, "j"));
4. 總結(jié)對(duì)比
| 插入方式 | 語(yǔ)法簡(jiǎn)潔度 | 效率 | 鍵存在時(shí)的行為 | 是否需要無(wú)參構(gòu)造函數(shù) |
|---|---|---|---|---|
map[key] = value | ★★★★★ | 較低 | 覆蓋原有值 | 是 |
emplace() | ★★★★☆ | 最高 | 不插入 | 否 |
insert({key, value}) | ★★★★☆ | 高 | 不插入 | 否 |
insert(pair<>) | ★★☆☆☆ | 高 | 不插入 | 否 |
建議:
- 需要覆蓋已有值時(shí)使用
[] - 通常插入使用
emplace或insert({}) - 查找使用
find,記得檢查返回值是否等于end() - 結(jié)構(gòu)體作為map值時(shí),建議提供無(wú)參構(gòu)造函數(shù)以兼容所有插入方式
到此這篇關(guān)于C++ map插入方式詳解及find使用方法的文章就介紹到這了,更多相關(guān)C++ map插入內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++小知識(shí):不要節(jié)約代碼行數(shù)
今天小編就為大家分享一篇關(guān)于C++小知識(shí):不要節(jié)約代碼行數(shù),小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-01-01
C++數(shù)組模擬之單鏈表與雙鏈表和棧和隊(duì)列的實(shí)現(xiàn)過程
這篇文章主要介紹了C++數(shù)組模擬之單鏈表與雙鏈表和棧和隊(duì)列的實(shí)現(xiàn)過程,了解內(nèi)部原理是為了幫助我們做擴(kuò)展,同時(shí)也是驗(yàn)證了一個(gè)人的學(xué)習(xí)能力,如果你想讓自己的職業(yè)道路更上一層樓,這些底層的東西你是必須要會(huì)的,跟隨下文來(lái)具體了解吧2023-02-02
C++通過SQLiteSDK增刪改查的實(shí)現(xiàn)示例
SQLite是一種輕量級(jí)的嵌入式數(shù)據(jù)庫(kù),可以利用SQLiteSDK執(zhí)行數(shù)據(jù)庫(kù)的增刪改查操作,本文主要介紹了C++通過SQLiteSDK增刪改查,具有一定的參考價(jià)值,感興趣的可以了解一下2025-03-03
C語(yǔ)言實(shí)現(xiàn)車輛出租管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)車輛出租管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-01-01

