習(xí)筆記---容器---map映射)
一、map 核心基礎(chǔ)特性必考成對(duì)存儲(chǔ)以key鍵 value值成對(duì)存儲(chǔ)一一映射關(guān)系Key唯一不重復(fù)鍵不能重復(fù)自動(dòng)有序默認(rèn)根據(jù)key從小到大升序排序與value無(wú)關(guān)底層結(jié)構(gòu)平衡二叉搜索樹(shù)紅黑樹(shù)和 set 完全一致支持下標(biāo)訪問(wèn)區(qū)別于 setmap 可以直接通過(guò)mp[key]讀寫數(shù)據(jù)二、頭文件與標(biāo)準(zhǔn)定義語(yǔ)法1. 必備頭文件#include map、#include iostream字符串操作需額外#include string2. 定義格式map鍵類型, 值類型 容器名; map鍵類型, 值類型 容器名{{key1,value1}.{key2,value2}}; //不對(duì)key排序 unordered_map鍵類型, 值類型 容器名;3. 常用定義示例mapint, int m1; // 整型鍵 → 整型值 mapchar, int m2; // 字符鍵 → 整型值統(tǒng)計(jì)字符次數(shù)專用 mapstring, int m3; // 字符串鍵 → 整型值統(tǒng)計(jì)單詞次數(shù) mapint, string m4; // 整型鍵 → 字符串值編號(hào)對(duì)應(yīng)名稱三、map 插入與修改數(shù)據(jù)兩種寫法1. 下標(biāo)法初學(xué)首選、最常用既能插入新數(shù)據(jù)也能覆蓋修改舊數(shù)據(jù)語(yǔ)法簡(jiǎn)單直觀。mapint, string mp; mp[1] C語(yǔ)言; mp[2] C; mp[1] 新版C語(yǔ)言; // key重復(fù)直接覆蓋舊value2. insert 插入法特點(diǎn)key重復(fù)時(shí)不覆蓋、不生效保留原值。mp.insert({3, Python});核心規(guī)則總結(jié)key不存在兩種方式均為新增鍵值對(duì)key已存在下標(biāo)法覆蓋值insert法無(wú)效不修改四、map 兩種遍歷方式考試必考map中每個(gè)元素是鍵值對(duì).first訪問(wèn) key鍵.second訪問(wèn) value值1. 范圍for強(qiáng)化循環(huán)重點(diǎn)考點(diǎn)for(auto p : mp){ cout 鍵 p.first 值 p.second endl; }2. 迭代器遍歷//正向 for(auto it mp.begin(); it ! mp.end(); it){ cout it-first it-second endl; } ?//反向 for(auto it mp.rbegin(); it ! mp.rend(); it){ cout it-first it-second endl; }五、map 全套核心成員函數(shù)mp.size()獲取鍵值對(duì)總個(gè)數(shù) mp.empty()判斷容器是否為空空返回true mp.clear()清空所有鍵值對(duì) mp.erase(key)刪除指定key的整組鍵值對(duì) mp.find(key)按key查找元素返回迭代器find() 查找規(guī)則和set完全一致查找成功返回當(dāng)前key的迭代器可取值查找失敗返回mp.end()auto it mp.find(2); if(it ! mp.end()){ cout 找到 it-second; }else{ cout 不存在該鍵; }六、map 超級(jí)易錯(cuò)重難點(diǎn)下標(biāo)訪問(wèn)自動(dòng)創(chuàng)建數(shù)據(jù)陷阱使用mp[不存在的key]時(shí)不會(huì)報(bào)錯(cuò)會(huì)自動(dòng)插入該keyvalue默認(rèn)初始化為0/空。mapint, int mp; cout mp[10]; // 自動(dòng)新增 key10, value0解決方案單純判斷key是否存在優(yōu)先使用find()不要用下標(biāo)判斷七、map 初學(xué)高頻易錯(cuò)點(diǎn)匯總map 排序只看key和value沒(méi)有任何關(guān)系。key唯一下標(biāo)法插入會(huì)覆蓋原值insert法插入會(huì)保留原值忽略新值。set不能用[]下標(biāo)map支持[]下標(biāo)訪問(wèn)是最大區(qū)別。下標(biāo)訪問(wèn)不存在的key會(huì)自動(dòng)新增鍵值對(duì)統(tǒng)計(jì)場(chǎng)景極易出錯(cuò)。map遍歷必須使用.first、.second取值不能直接輸出元素。find函數(shù)僅根據(jù)key查找無(wú)法通過(guò)value查找數(shù)據(jù)。map有序、unordered_map無(wú)序做題需根據(jù)是否需要排序選擇容器。#include iostream #include map #include string using namespace std; int main(){ mapint, string mp; // 1. 下標(biāo)插入 覆蓋修改 mp[2] C; mp[1] Python; mp[3] Java; mp[1] Python新版; // 2. 范圍for遍歷自動(dòng)按key升序 cout map有序遍歷結(jié)果 endl; for(auto p : mp) { cout key: p.first value: p.second endl; } // 3. find查找測(cè)試 auto it mp.find(2); if(it ! mp.end()){ cout \n查找成功 it-first it-second endl; }else{ cout \n查找失敗 endl; } // 4. 刪除元素 mp.erase(3); cout \n刪除key3后剩余元素個(gè)數(shù) mp.size() endl; return 0; }