最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++ map插入方式詳解及find使用方法

 更新時間:2026年06月05日 09:31:03   作者:Tianwen_Burning  
這段文章詳細(xì)介紹了C++中std::map的四種插入方式及其特點(diǎn),包括使用下標(biāo)運(yùn)算符[]、emplace、insert和pair等方法,并解釋了為何結(jié)構(gòu)體需要無參構(gòu)造函數(shù)以兼容所有插入方式,感興趣的朋友一起看看吧

1. map的四種插入方式

在C++中,std::map 提供了多種插入元素的方式。以下是四種常用的插入方法:

1.1 使用下標(biāo)運(yùn)算符[](最簡單)

map1[0] = student(101, "j");

特點(diǎn):

  • 語法最簡潔直觀
  • 如果鍵不存在,會先創(chuàng)建該鍵,然后賦值
  • 如果鍵已存在,會覆蓋原有的值
  • 需要結(jié)構(gòu)體有默認(rèn)構(gòu)造函數(shù)(因為會先創(chuàng)建默認(rèn)對象再賦值)

1.2 使用emplace(C++11推薦)

map1.emplace(60, student(222, "d"));

特點(diǎn):

  • C++11引入的高效插入方式
  • 直接在map內(nèi)部構(gòu)造元素,避免臨時對象的創(chuàng)建和拷貝
  • 如果鍵已存在,不會插入新元素
  • 返回一個pair,first是迭代器,second是bool表示是否插入成功

1.3 使用insert和初始化列表(最易懂)

map1.insert({900, student(500, "rr")});

特點(diǎn):

  • 使用初始化列表語法,代碼清晰易讀
  • 如果鍵已存在,不會插入新元素
  • 返回一個pair,first是迭代器,second是bool表示是否插入成功

1.4 使用insert和pair(最詳細(xì)但啰嗦)

map1.insert(pair<int, student>(70, student(2000, "bad")));

特點(diǎn):

  • 顯式指定pair類型,代碼最詳細(xì)
  • 如果鍵已存在,不會插入新元素
  • 可以使用 make_pair 簡化: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)體需要無參構(gòu)造函數(shù)的原因

當(dāng)map的值為結(jié)構(gòu)體時,結(jié)構(gòu)體必須有無參構(gòu)造函數(shù),原因如下:

3.1 下標(biāo)運(yùn)算符[]的要求

map1[0] = student(101, "j");

這行代碼實際上執(zhí)行了兩個步驟:

  1. map1[0] - 如果鍵0不存在,會創(chuàng)建一個默認(rèn)構(gòu)造的student對象
  2. = student(101, "j") - 然后將這個默認(rèn)對象替換為新對象

如果沒有無參構(gòu)造函數(shù),第一步就會失敗。

3.2 結(jié)構(gòu)體定義示例

struct student {
    int scor;
    string name;
    
    // 必須有無參構(gòu)造函數(shù)
    student() {
        scor = 0;
        name = "";
    };
    
    // 帶參數(shù)的構(gòu)造函數(shù)
    student(int scor0, string name0) {
        scor = scor0;
        name = name0;
    };
};

3.3 替代方案

如果不想提供無參構(gòu)造函數(shù),可以使用以下插入方式:

// 使用insert或emplace,避免使用[]
map1.insert({0, student(101, "j")});
map1.emplace(0, student(101, "j"));

4. 總結(jié)對比

插入方式語法簡潔度效率鍵存在時的行為是否需要無參構(gòu)造函數(shù)
map[key] = value★★★★★較低覆蓋原有值
emplace()★★★★☆最高不插入
insert({key, value})★★★★☆不插入
insert(pair<>)★★☆☆☆不插入

建議:

  • 需要覆蓋已有值時使用 []
  • 通常插入使用 emplaceinsert({})
  • 查找使用 find,記得檢查返回值是否等于 end()
  • 結(jié)構(gòu)體作為map值時,建議提供無參構(gòu)造函數(shù)以兼容所有插入方式

到此這篇關(guān)于C++ map插入方式詳解及find使用方法的文章就介紹到這了,更多相關(guān)C++ map插入內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++小知識:不要節(jié)約代碼行數(shù)

    C++小知識:不要節(jié)約代碼行數(shù)

    今天小編就為大家分享一篇關(guān)于C++小知識:不要節(jié)約代碼行數(shù),小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-01-01
  • C++數(shù)組模擬之單鏈表與雙鏈表和棧和隊列的實現(xiàn)過程

    C++數(shù)組模擬之單鏈表與雙鏈表和棧和隊列的實現(xiàn)過程

    這篇文章主要介紹了C++數(shù)組模擬之單鏈表與雙鏈表和棧和隊列的實現(xiàn)過程,了解內(nèi)部原理是為了幫助我們做擴(kuò)展,同時也是驗證了一個人的學(xué)習(xí)能力,如果你想讓自己的職業(yè)道路更上一層樓,這些底層的東西你是必須要會的,跟隨下文來具體了解吧
    2023-02-02
  • C語言指針入門學(xué)習(xí)面面觀

    C語言指針入門學(xué)習(xí)面面觀

    這篇文章主要介紹了C語言指針的一些基礎(chǔ)知識,指針可以說是C語言入門學(xué)習(xí)中的頭等大事,文中從數(shù)組和函數(shù)等多方面剖析C中指針的作用,需要的朋友可以參考下
    2016-02-02
  • C++ string字符串的修改與替換方法詳析

    C++ string字符串的修改與替換方法詳析

    這篇文章主要給大家介紹了關(guān)于C++ string字符串修改與替換方法的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • C++枚舉類型enum與enum class的使用

    C++枚舉類型enum與enum class的使用

    這篇文章主要介紹了C++枚舉類型enum與enum class的使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • C++中queue容器的具體使用

    C++中queue容器的具體使用

    本文主要介紹了C++中queue容器的具體使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03
  • C++通過SQLiteSDK增刪改查的實現(xiàn)示例

    C++通過SQLiteSDK增刪改查的實現(xiàn)示例

    SQLite是一種輕量級的嵌入式數(shù)據(jù)庫,可以利用SQLiteSDK執(zhí)行數(shù)據(jù)庫的增刪改查操作,本文主要介紹了C++通過SQLiteSDK增刪改查,具有一定的參考價值,感興趣的可以了解一下
    2025-03-03
  • VSCode C/C++多文件編譯配置小結(jié)

    VSCode C/C++多文件編譯配置小結(jié)

    本文主要介紹了VSCode C/C++多文件編譯配置小結(jié),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-08-08
  • C語言實現(xiàn)車輛出租管理系統(tǒng)

    C語言實現(xiàn)車輛出租管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C語言實現(xiàn)車輛出租管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-01-01
  • C++ cin.getline及getline()用法詳解

    C++ cin.getline及getline()用法詳解

    這篇文章主要介紹了C++ cin.getline用法及C++ getline()的兩種用法,本文通過實例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-02-02

最新評論

宁蒗| 璧山县| 化德县| 巨野县| 肥西县| 女性| 芦溪县| 海南省| 湾仔区| 邵武市| 禄丰县| 贡山| 曲松县| 鄂温| 武乡县| 疏勒县| 建水县| 麟游县| 巴林左旗| 正蓝旗| 晋中市| 丰原市| 高台县| 砚山县| 安顺市| 焦作市| 延庆县| 深圳市| 长沙市| 龙游县| 微博| 萨嘎县| 龙陵县| 定远县| 九龙城区| 万宁市| 武安市| 宜章县| 紫云| 万载县| 沙湾县|