C++ 中 `std::map` 的 `insert` 函數

1. 函數的概念與用途

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

核心用途:

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

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


2. 函數的聲明與出處

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

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

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

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

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

  1. first:一個迭代器(iterator)。

    • 如果插入成功(即原先不存在該鍵),它指向新插入的那個元素。
    • 如果插入失敗(即該鍵已存在),它指向map已經存在的那個同名鍵的元素。
  2. second:一個布爾值(bool)。

    • 如果插入成功,值為 true
    • 如果插入失敗(鍵已存在),值為 false

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


4. 參數的含義與取值范圍

最常用的重載版本參數是 const value_type& value

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

其他常見重載:

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

5. 函數使用案例

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

#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";}// 方式二:更現代的方法,使用 make_pair 或 {}auto ret2 = studentMap.insert({2, "Bob"});if (ret2.second) {std::cout << "Inserted student: (" << ret2.first->first << ", " << ret2.first->second << ")\n";}// 嘗試插入一個重復的鍵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 的結構化綁定 (Structured Binding) 來簡化返回值處理auto [iterator, success] = studentMap.insert({3, "David"});if (success) {std::cout << "Inserted student: (" << iterator->first << ", " << iterator->second << ")\n";}// 打印整個 mapstd::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 的結構化綁定特性,所以需要指定標準。如果使用更早的 C++ 標準(如 C++11),可以將結構化綁定部分改為傳統的 std::pair 訪問方式(ret.second)。

注意事項:

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

7. 執行結果說明

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

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

結果解釋:

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

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

下面這個流程圖總結了 std::map::insert 函數的執行邏輯和返回值處理過程:

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:<br/>iterator (points to existing element)<br/>bool (false)"]
D --> E["End (No change to map)"]B -- No (Key is new) --> F[Insertion succeeds]
F --> G["Return a pair:<br/>iterator (points to new element)<br/>bool (true)"]
G --> H["End (New element added)"]

在這里插入圖片描述

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

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

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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/96770.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/96770.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/96770.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【機器學習學習筆記】機器學習引言

前言本文章是撥珠自己的學習筆記&#xff0c;自用為主&#xff0c;學習請移步專門教程&#xff0c;若有錯誤請大佬輕噴&#xff0c;也歡迎同好交流學習。本文將闡述三個問題。什么是機器學習&#xff1f;監督學習、無監督學習到底在干什么&#xff1f;分類、回歸、聚類又是怎么…

程序設計---狀態機

在軟件工程、嵌入式開發、自動化控制等領域&#xff0c;狀態機&#xff08;State Machine&#xff09;是一種描述系統行為的強大工具。它通過抽象“狀態”“事件”“轉換”和“動作”四大核心要素&#xff0c;將復雜的邏輯流程轉化為可視化、可驗證的狀態流轉規則&#xff0c;廣…

GaussDB 數據庫架構師修煉(十八) SQL引擎-分布式計劃

1 分布式架構GaussDB基于MPP &#xff08;Massively Parallel Processing&#xff09; 并行架構Streaming流式計算框架2 分布式計劃CN輕量化&#xff08;light proxy&#xff09; FQS&#xff08; fast query shipping &#xff09; STREAM計劃 XC計劃計劃類型場景原理CN…

微前端架構核心要點對比

1. 樣式隔離 常見的隔離方式有以下幾種,還是根據自身業務來確定: 1.1. shadowDOM 目前相對來說使用最多的樣式隔離機制。 但shadowDOM并不是銀彈,由于子應用的樣式作用域僅在 shadow 元素下,那么一旦子應用中出現運行時“翻墻”跑到外面構建 DOM 的場景,必定會導致構建…

VMware 17.6安裝包下載與保姆級圖文安裝教程!

軟件下載 [軟件名稱]&#xff1a;VMware 17.6 [軟件大小]&#xff1a;226.66MB [系統環境]&#xff1a;win 7/8/10/11或更高&#xff0c;64位操作系統 VMware合集&#xff0c;軟件下載&#xff08;夸克網盤需手機打開&#xff09;&#xff1a;&#xff1a;VMware合集丨夸克網…

關于微服務下的不同服務之間配置不能通用的問題

問題引入現有兩個服務&#xff0c;一個是 A 服務&#xff0c;一個是 B 服務&#xff0c;并且這兩個服務都需要使用 mysql。現 B 服務中引入了 A 服務的依賴&#xff0c;在 A 服務中添加了 mysql 的相關配置&#xff0c;那么這時就有一個問題&#xff1a;既然 B 已經引入了 A 的…

【機器學習項目 心臟病預測】

文章目錄心臟病預測導入數據集數據集介紹理解數據數據處理機器學習K近鄰分類器邏輯回歸支持向量分類器&#xff08;SVC&#xff09;決策樹分類器隨機森林分類器結論心臟病預測 在這個機器學習項目中&#xff0c;我們使用UCI心臟病數據集 UCI &#xff0c;并將使用機器學習方法…

【論文閱讀 | arXiv 2025 | WaveMamba:面向RGB-紅外目標檢測的小波驅動Mamba融合方法】

論文閱讀 | arXiv 2025 | WaveMamba&#xff1a;面向RGB-紅外目標檢測的小波驅動Mamba融合方法??1&&2. 摘要&&引言3. 方法3.1. 預備知識3.2. WaveMamba3.3. WaveMamba融合塊&#xff08;WMFB&#xff09;3.3.1. 低頻Mamba融合塊&#xff08;LMFB&#xff09;…

DevExpress發布PowerPoint Presentation API庫,支持跨平臺與 PDF 導出

DevExpress專注于為 .NET、JavaScript、VCL 等多種平臺提供高性能 UI 控件、報表工具、數據可視化組件及開發框架&#xff0c;產品覆蓋桌面、Web、移動及跨平臺應用開發領域。憑借穩定的性能、豐富的功能與優質的技術支持&#xff0c;DevExpress 的解決方案已廣泛應用于金融、制…

Vue3使用 DAG 圖(AntV X6)

參考文檔 AntV X6 文檔 可自定義設置以下屬性 容器寬度&#xff08;width&#xff09;&#xff0c;類型&#xff1a;number | string&#xff0c;默認 ‘100%’容器高度&#xff08;height&#xff09;&#xff0c;類型&#xff1a;number | string&#xff0c;默認 ‘100%’…

【數據結構】跳表的概率模型詳解與其 C 代碼實現

文章目錄介紹關鍵組成部分讀者可以比對這張圖片去理解跳表 ![在這里插入圖片描述](https://i-blog.csdnimg.cn/direct/c5704b6276a14c3f9facdc3e55015bcc.jpeg#pic_center) 核心操作原理算法的概率模型跳表的 C代碼實現初始化跳躍表的節點、跳躍表本身跳表插入節點查找元素更新…

Verilog實現除法器

文章目錄基本原理確定除數最高位移位相減基本原理 若想得到yx\frac{y}{x}xy?的商和余數&#xff0c;一種最直觀的想法就是不斷地用yyy減掉xxx&#xff0c;直到y<xy< xy<x為止&#xff0c;寫成偽代碼如下 z 0 while y<x:y - xz 1這種算實在是太低效了&#xff…

EasyLive的一些疑問

目錄 一、pinia是什么 二、html的代碼片段又失效&#xff1f; 三、Request.js 四 、狀態管理庫 五、main.js:19 Uncaught SyntaxError: The requested module /src/utils/Api.js?t1745328489985 does not provide an export named default (at main.js:19:8)?編輯 六、…

C++(String):

目錄 string與C中字符串的區別&#xff1a; C字符串&#xff1a; string字符串&#xff1a; string的定義和初始化&#xff1a; 輸入字符串&#xff1a; 方式1&#xff1a; 方式2&#xff1a; 字符串的拼接的操作&#xff1a; 方式1&#xff1a;使用“” 方式2&#…

【Linux】Java線上問題,一分鐘日志定位

【Linux】Java線上問題&#xff0c;一分鐘日志定位1. 查看異常堆棧2. 實時叮新日志3. 翻歷史/壓縮日志4. 統計異常數量5. 多種異常一起查6. 反向過濾7. 同時滿足多個關鍵字查詢8. 定位最近一次異常9. 異常排行榜1. 查看異常堆棧 # 在 a.log 文件中查找包含 NullPointerExcepti…

智慧農業溫室大棚遠程監控物聯網系統解決方案

一、方案背景與目標隨著現代農業向智能化、精準化轉型&#xff0c;傳統溫室大棚管理面臨效率低、響應慢、成本高等痛點。本方案通過部署御控農業物聯網系統&#xff0c;實現溫室環境參數實時監測、設備遠程控制、數據智能分析及預警決策&#xff0c;助力農戶降低人工成本&#…

【剖析高并發秒殺】從流量削峰到數據一致性的架構演進與實踐

一、 挑戰&#xff1a;三高背景下的數據庫瓶頸秒殺場景的核心挑戰可以歸結為“三高”&#xff1a;高并發、高性能、高可用。而系統中最脆弱的一環&#xff0c;往往是我們的關系型數據庫&#xff08;如MySQL&#xff09;。它承載著最終的數據落地&#xff0c;其連接數、IOPS和CP…

Redisson最新版本(3.50.0左右)啟動時提示Netty的某些類找不到

文章目錄一、寫在前面二、解決方案1、解決方案2、一勞永逸3、確定redisson依賴netty的版本一、寫在前面 Redisson最新版本&#xff0c;大概3.47.0&#xff0c;在JDK8環境下&#xff08;實測JDK17也一樣&#xff09;會提示Netty的某些類找不到&#xff1a; Exception in threa…

MTK Linux DRM分析(八)- KMS drm_crtc.c

一、簡介 Linux DRM(Direct Rendering Manager)子系統是內核中管理圖形硬件的核心組件,而 CRTC(CRT Controller)又是其中的關鍵之一。它起源于過去控制陰極射線管(CRT)顯示器的控制器概念,如今在現代圖形顯示中依舊扮演著至關重要的角色。 可以把 CRTC 想象成圖形顯示…

vue+openlayers示例:適配arcgis矢量瓦片服務以及樣式(附源碼下載)

由于單位這邊有個項目是基于openlayers地圖引擎框架實現webgis地圖可視化功能&#xff0c;但是要調用第三方的arcgis矢量瓦片服務以及適配樣式&#xff0c;在這個背景下&#xff0c;基于openlayersvue實現適配arcgis矢量瓦片服務以及樣式效果&#xff0c;適合學習openlayers與前…