亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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_pairemplace(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 異常安全性

insertemplace提供強異常保證:如果插入失敗,容器保持不變。

8.3 性能優(yōu)化

對于大批量插入:

如果鍵已知有序,可以使用提示位置插入:

mapStu.insert(hint_iterator, make_pair(10, "孫八"));

或者先構建vector再批量插入

到此這篇關于C++ map容器: 插入操作的文章就介紹到這了,更多相關C++ map容器插入內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • c++實現(xiàn)簡單的線程池

    c++實現(xiàn)簡單的線程池

    這里給大家介紹了C++中對于pthread線程的一個簡單應用以及使用繼承CDoit,實現(xiàn)其中的start和end,有需要的小伙伴可以參考下
    2015-11-11
  • 基于C語言實現(xiàn)鉆石棋游戲的示例代碼

    基于C語言實現(xiàn)鉆石棋游戲的示例代碼

    獨立鉆石是源于18世紀法國的宮廷貴族的自我挑戰(zhàn)類單人棋游戲,可以鍛煉邏輯思維能力。本文將用C語言實現(xiàn)這一簡單的游戲,感興趣的小伙伴可以了解一下
    2023-02-02
  • 深入理解C++?字符變量取地址的特殊性與內存管理機制詳解

    深入理解C++?字符變量取地址的特殊性與內存管理機制詳解

    在?C++?編程中,字符變量的取地址行為和內存布局對程序行為有著深遠的影響,尤其是在打印變量地址和訪問內存內容時,本文將給大家介紹C++?字符變量取地址的特殊性與內存管理機制,感興趣的朋友一起看看吧
    2024-12-12
  • C++封裝線程類的實現(xiàn)方法

    C++封裝線程類的實現(xiàn)方法

    這篇文章主要介紹了C++封裝線程類的實現(xiàn)方法,實例介紹了針對線程的創(chuàng)建、調用等方法的封裝操作,需要的朋友可以參考下
    2014-10-10
  • 舉例分析private的作用(c/c++學習)

    舉例分析private的作用(c/c++學習)

    我知道我們可以用 public 中的值,把private中的數(shù)據(jù)給提出來,但是還是搞不懂private該怎么用,或者說在一個具體程序中,private有什么用
    2020-08-08
  • C++類的構造與析構特點及作用詳解

    C++類的構造與析構特點及作用詳解

    本文章將會可能會涉及到匯編的知識,不過沒有關系,我會講的盡量通俗易懂;另外本篇文章開始前,建議了解下什么是函數(shù)重載,這個概念很簡單的--有相同的函數(shù)名,但參數(shù)列表不相同的函數(shù),就是函數(shù)重載
    2022-10-10
  • C++超詳細分析紅黑樹

    C++超詳細分析紅黑樹

    這一篇我要跟大家介紹二叉搜索樹中的另一顆樹——紅黑樹,它主要是通過控制顏色來控制自身的平衡,但它的平衡沒有AVL樹的平衡那么嚴格
    2022-03-03
  • 詳解C語言printf()輸出格式

    詳解C語言printf()輸出格式

    這篇文章主要介紹了C語言printf()輸出格式,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-03-03
  • vscode+qt5+cmake編譯調試過程解析

    vscode+qt5+cmake編譯調試過程解析

    這篇文章主要介紹了vscode+qt5+cmake編譯調試過程解析,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-03-03
  • C語言實現(xiàn)簡易的三子棋小游戲

    C語言實現(xiàn)簡易的三子棋小游戲

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)簡易的三子棋小游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-08-08

最新評論