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

C++?中?std::map的insert函數(shù)使用案例

 更新時間:2025年08月26日 10:02:09   作者:青草地溪水旁  
C++中std::map::insert用于安全插入鍵值對,檢查鍵是否存在避免覆蓋,返回迭代器和布爾值,支持多種重載形式,鍵唯一,時間復(fù)雜度O(logn),需注意返回值判斷,本文給大家介紹C++?中?std::map的insert函數(shù)使用案例,感興趣的朋友一起看看吧

1. 函數(shù)的概念與用途

std::map::insert 是 C++ 標(biāo)準(zhǔn)模板庫(STL)中 map 容器的一個核心成員函數(shù)。它的核心任務(wù)很明確:map 中插入一個新的鍵值對(key-value pair)

核心用途:

  • 數(shù)據(jù)構(gòu)建:初始化一個 map 或動態(tài)地向其中添加數(shù)據(jù)。
  • 避免重復(fù):在插入前,map 會檢查鍵(key)是否已存在。如果鍵已存在,則插入操作通常不會覆蓋原有的值(這與 [] 操作符的行為不同)。這個特性使得 insert 非常適合用于“如果不存在則添加”的場景,例如詞頻統(tǒng)計時初始化一個詞的計數(shù)器為1。

簡單來說,insert 是一個“安全”的插入方式,它不會意外地覆蓋你已經(jīng)存在的數(shù)據(jù)。

2. 函數(shù)的聲明與出處

std::map 及其 insert 函數(shù)定義在 <map> 頭文件中,屬于 C++ 標(biāo)準(zhǔn)庫,因此不需要額外鏈接庫,只需包含頭文件即可。

它有多個重載版本,最常用的一種聲明如下:

#include <map>
std::pair<iterator, bool> insert(const value_type& value);
  • 這里的 value_type 對于 std::map<int, std::string> 來說,就是 std::pair<const int, std::string>。你需要構(gòu)造一個這樣的鍵值對對象傳給它。

3. 返回值的含義與取值范圍

這是 insert 函數(shù)非常關(guān)鍵的一部分。它的返回值是一個 std::pair,包含兩個成員:

  • first:一個迭代器(iterator)。
    • 如果插入成功(即原先不存在該鍵),它指向新插入的那個元素。
    • 如果插入失敗(即該鍵已存在),它指向map已經(jīng)存在的那個同名鍵的元素。
  • second:一個布爾值(bool)。
    • 如果插入成功,值為 true。
    • 如果插入失敗(鍵已存在),值為 false。

通過檢查 second 成員,你可以立即知道插入操作是否成功。

4. 參數(shù)的含義與取值范圍

最常用的重載版本參數(shù)是 const value_type& value

  • 參數(shù) value
    • 含義:要插入的鍵值對。其類型必須是 std::pair<const Key, T>,其中 Key 是鍵的類型,T 是值的類型。
    • 取值范圍:任何有效的該類型的對象。鍵(first)必須是唯一的,如果鍵重復(fù),則插入操作無效。

其他常見重載:

  • insert(iterator hint, const value_type& value);:提供一個“提示”(hint)迭代器,提示新元素可能會插入在這個迭代器指向的元素之后。如果提示準(zhǔn)確,可以加快插入速度;如果不準(zhǔn)確,也沒關(guān)系,插入操作會正常進(jìn)行。
  • insert(InputIt first, InputIt last);:允許插入一個范圍內(nèi)的多個元素,例如從另一個 map 插入。

5. 函數(shù)使用案例

下面是一個典型的代碼示例,演示了如何插入、如何檢查返回值以及如何避免重復(fù)插入。

#include <iostream>
#include <map>
#include <string>
int main() {
    std::map<int, std::string> studentMap;
    // 方式一:直接用 pair 插入
    auto ret1 = studentMap.insert(std::pair<const int, std::string>(1, "Alice"));
    if (ret1.second) {
        std::cout << "Inserted student: (" << ret1.first->first << ", " << ret1.first->second << ")\n";
    }
    // 方式二:更現(xiàn)代的方法,使用 make_pair 或 {}
    auto ret2 = studentMap.insert({2, "Bob"});
    if (ret2.second) {
        std::cout << "Inserted student: (" << ret2.first->first << ", " << ret2.first->second << ")\n";
    }
    // 嘗試插入一個重復(fù)的鍵
    auto ret3 = studentMap.insert({1, "Charlie"}); // 鍵 1 已存在
    if (!ret3.second) {
        std::cout << "Insertion failed. Key " << 1 << " already exists with value: " << ret3.first->second << "\n";
    }
    // 使用 C++17 的結(jié)構(gòu)化綁定 (Structured Binding) 來簡化返回值處理
    auto [iterator, success] = studentMap.insert({3, "David"});
    if (success) {
        std::cout << "Inserted student: (" << iterator->first << ", " << iterator->second << ")\n";
    }
    // 打印整個 map
    std::cout << "\nFinal map contents:\n";
    for (const auto& [id, name] : studentMap) {
        std::cout << id << " => " << name << '\n';
    }
    return 0;
}

6. 編譯方式與注意事項

編譯命令(使用 GCC):

g++ -std=c++17 -o map_insert_demo map_insert_demo.cpp
  • -std=c++17:本例中使用了 C++17 的結(jié)構(gòu)化綁定特性,所以需要指定標(biāo)準(zhǔn)。如果使用更早的 C++ 標(biāo)準(zhǔn)(如 C++11),可以將結(jié)構(gòu)化綁定部分改為傳統(tǒng)的 std::pair 訪問方式(ret.second)。

注意事項:

  1. 鍵的唯一性map 的鍵是唯一的。insert 不會覆蓋已存在的鍵對應(yīng)的值。如果你想要覆蓋,應(yīng)該使用 map[key] = value;。
  2. 性能:插入操作的時間復(fù)雜度為 O(log n),因為 map 底層通常是紅黑樹實現(xiàn)。
  3. 返回值務(wù)必檢查:如果你需要知道插入是否成功,一定要檢查返回值的 second 成員。忽略返回值可能會導(dǎo)致你誤以為插入成功了。
  4. C++11 及以上:推薦使用花括號 {} 來創(chuàng)建 pair 對象,代碼更簡潔(如 {key, value})。

7. 執(zhí)行結(jié)果說明

運行上面的示例代碼,你會得到如下輸出:

Inserted student: (1, Alice)
Inserted student: (2, Bob)
Insertion failed. Key 1 already exists with value: Alice
Inserted student: (3, David)
Final map contents:
1 => Alice
2 => Bob
3 => David

結(jié)果解釋:

  1. 前兩次插入(鍵1和鍵2)都成功了,所以打印了插入的信息。
  2. 第三次嘗試插入鍵1(值為"Charlie")時失敗了,因為鍵1已存在(其值為"Alice")。程序打印出了失敗信息和已存在的值。
  3. 第四次插入(鍵3)使用 C++17 語法,成功插入。
  4. 最后遍歷整個 map,可以看到只有三個元素,重復(fù)插入的 “Charlie” 并沒有出現(xiàn),證明了 insert 的保護性。

8. 圖文總結(jié) (Mermaid流程圖)

下面這個流程圖總結(jié)了 std::map::insert 函數(shù)的執(zhí)行邏輯和返回值處理過程:

flowchart TD
A["Start insert(std::pair<const Key, T> value)"] --> B{"Does the key\nalready exist in the map?"}
B -- Yes (Key exists) --> C[Insertion fails]
C --> D["Return a pair:
iterator (points to existing element)
bool (false)"]
D --> E["End (No change to map)"]
B -- No (Key is new) --> F[Insertion succeeds]
F --> G["Return a pair:
iterator (points to new element)
bool (true)"]
G --> H["End (New element added)"]

流程圖解讀:
該流程圖清晰地展示了 insert 函數(shù)的決策過程:

  1. 函數(shù)開始后,首先檢查待插入的鍵(Key)是否在 map 中已存在。
  2. 如果存在:插入失敗,函數(shù)返回一個 pair,其中迭代器指向已存在的元素,bool 值為 false。map 內(nèi)容不發(fā)生任何變化。
  3. 如果不存在:插入成功,新鍵值對被添加到 map 中,函數(shù)返回一個 pair,其中迭代器指向新插入的元素,bool 值為 true。

這個“檢查-決策-返回”的過程完美地體現(xiàn)了 insert 函數(shù)安全、不覆蓋的特性。

到此這篇關(guān)于C++ 中 `std::map` 的 `insert` 函數(shù)的文章就介紹到這了,更多相關(guān)C++ std::map insert函數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 關(guān)于"引用"的幾點說明介紹

    關(guān)于"引用"的幾點說明介紹

    引用聲明完畢后,相當(dāng)于目標(biāo)變量名有兩個名稱,即該目標(biāo)原名稱和引用名,且不能再把該引用名作為其他變量名的別名
    2013-09-09
  • C++類的構(gòu)造與析構(gòu)特點及作用詳解

    C++類的構(gòu)造與析構(gòu)特點及作用詳解

    本文章將會可能會涉及到匯編的知識,不過沒有關(guān)系,我會講的盡量通俗易懂;另外本篇文章開始前,建議了解下什么是函數(shù)重載,這個概念很簡單的--有相同的函數(shù)名,但參數(shù)列表不相同的函數(shù),就是函數(shù)重載
    2022-10-10
  • 詳解c++種gmock單元測試框架

    詳解c++種gmock單元測試框架

    這篇文章我們給大家分享了關(guān)于c++種gmock單元測試框架的相關(guān)知識點內(nèi)容,有興趣的朋友們學(xué)習(xí)下。
    2018-08-08
  • C++實現(xiàn)二分法求方程近似解

    C++實現(xiàn)二分法求方程近似解

    這篇文章主要為大家詳細(xì)介紹了C++實現(xiàn)二分法求方程近似解,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-05-05
  • C語言如何在字符數(shù)組中插入一個字符

    C語言如何在字符數(shù)組中插入一個字符

    這篇文章主要介紹了C語言如何在字符數(shù)組中插入一個字符,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • C語言數(shù)組實現(xiàn)學(xué)生信息管理系統(tǒng)設(shè)計

    C語言數(shù)組實現(xiàn)學(xué)生信息管理系統(tǒng)設(shè)計

    這篇文章主要為大家詳細(xì)介紹了C語言數(shù)組實現(xiàn)學(xué)生信息管理系統(tǒng)設(shè)計,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • c++10進(jìn)制轉(zhuǎn)換為任意2-16進(jìn)制數(shù)字的實例

    c++10進(jìn)制轉(zhuǎn)換為任意2-16進(jìn)制數(shù)字的實例

    下面小編就為大家?guī)硪黄猚++10進(jìn)制轉(zhuǎn)換為任意2-16進(jìn)制數(shù)字的實例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-06-06
  • C語言結(jié)構(gòu)體的全方面解讀

    C語言結(jié)構(gòu)體的全方面解讀

    C 數(shù)組允許定義可存儲相同類型數(shù)據(jù)項的變量,結(jié)構(gòu)是 C 編程中另一種用戶自定義的可用的數(shù)據(jù)類型,它允許你存儲不同類型的數(shù)據(jù)項
    2021-10-10
  • C++實現(xiàn)對RGB圖片進(jìn)行編碼的示例代碼

    C++實現(xiàn)對RGB圖片進(jìn)行編碼的示例代碼

    這篇文章主要為大家詳細(xì)介紹了如何利用得到的RGB信息重新對RGB圖片進(jìn)行編碼,以及對其他圖片如BMP所得到的RGB信息進(jìn)行編碼從而得到*.jpg文件,感興趣的可以了解一下
    2023-05-05
  • 隊列的動態(tài)鏈?zhǔn)酱鎯崿F(xiàn)代碼分享

    隊列的動態(tài)鏈?zhǔn)酱鎯崿F(xiàn)代碼分享

    DynaLnkQueue.cpp - 動態(tài)鏈?zhǔn)疥犃?,即隊列的動態(tài)鏈?zhǔn)酱鎯崿F(xiàn)
    2014-02-02

最新評論

丰宁| 德令哈市| 土默特左旗| 南漳县| 阳谷县| 惠来县| 墨玉县| 宁波市| 搜索| 崇信县| 文化| 藁城市| 宾阳县| 额尔古纳市| 大名县| 江北区| 南康市| 山阳县| 东乌| 布尔津县| 龙陵县| 吉安县| 商城县| 民乐县| 从江县| 余姚市| 承德市| 双辽市| 兴国县| 昔阳县| 肥东县| 商丘市| 垫江县| 岳池县| 犍为县| 浦县| 景宁| 昌平区| 望都县| 西安市| 赤水市|