c++中的map容器

map/multimap基本概念

  1. Map的特性是,所有元素都會根據元素的鍵值自動排序。Map所有的元素都是pair,同時擁有實值和鍵值,pair的第一元素被視為鍵值,第二元素被視為實值,map不允許兩個元素有相同的鍵值
  2. 我們可以通過map的i迭代器改變mao的鍵值嗎?答案是不行,因為map的鍵值關系到map元素的排列規則,任意改變map鍵值會嚴重破壞map的組織,如果想要修改元素的實值,是可以的
  3. Map和list擁有相同的某些性質,當對它的容器元素進行新增操作或者刪除操作時,操作之前的所有迭代器,在操作完成之后依然有效,當然被刪除的那個元素的迭代器必然是個例外
  4. Multimap和map的操作類似,唯一區別multimap的鍵值可以重復
  5. map和multimap都是以紅黑樹為底層實現機制

map 對象的拷貝構造與賦值

  1. map(constmap&mp); //拷貝構造函數
  2. map&operator=(constmap&mp); //重載等號操作符
  3. map.swap(mp); //交換兩個集合容器

map 的大小操作

  1. map.size();//返回容器中元素的數目
  2. map.empty();//判斷容器是否為空

map 的刪除操作

  1. map.clear(); //刪除所有元素 ? map.erase(pos);//刪除 pos 迭代器所指的元素,返回下一個元素的迭代器。
  2. map.erase(beg,end); //刪除區間[beg,end)的所有元素 ,返回下一個元素的迭代器。
  3. map.erase(keyElem); //刪除容器中 key 為 keyElem 的對組。
  void test02(){map<int, int>m;m.insert(pair<int, int>(1, 10));m.insert(make_pair(2, 20));m.insert(map<int, int>::value_type(3, 30));m[4] = 40;m.erase(1);for (map<int, int >::iterator it = m.begin(); it != m.end(); it++){cout << "key=" << it->first << "value" << it->second << endl;}map<int,int>::iterator pos=m.find(2);if (pos != m.end()){cout << "找到,key值為:" << pos->first << "value" << pos->second << endl;}else{cout << "未找到" << endl;}int num=m.count(3);//map的count要么0要么1cout << "num=" << num << endl;//lower_bound(keyElem);//返回第一個key>=keyElem元素的迭代器map<int, int>::iterator ret = m.lower_bound(3);if (ret != m.end()){cout << "lower_bound中key" << ret->first << "value" << ret->second << endl;}else{cout << "未找到" << endl;}//upper_bound(keyElem);//返回第一個key>keyElem元素的迭代器ret = m.upper_bound(3);if (ret != m.end()){cout << "upper_bound中key" << ret->first << "value" << ret->second << endl;}else{cout << "未找到" << endl;}pair<map<int,int>::iterator,map<int,int>::iterator>ret2= m.equal_range(3);if (ret2.first != m.end()){cout << "找到了equal_range中的lower_bound的key" << ret2.first->first << "value" << ret2.first->second << endl;}else{cout << "未找到" << endl;}if (ret2.second != m.end()){cout << "找到了equal_range中的upper_bound的key" << ret2.second->first << "value" << ret2.second->second << endl;}else{cout << "未找到" << endl;}}

map 的查找操作

  1. map.find(key); 查找鍵 key 是否存在,若存在,返回該鍵的元素的迭代器;若不存 在,返回 map.end();
  2. map.count(keyElem); //返回容器中 key 為 keyElem 的對組個數。對 map 來說,要 么是 0,要么是 1。對 multimap 來說,值可能大于 1。

map 的插入與迭代器

  1. map.insert(…); //往容器插入元素,返回 pair<iterator,bool>
  2. 在 map 中插入元素的三種方式: 假設 map<int,string>mapStu;
  3. 通過 pair 的方式插入對象 mapStu.insert( pair<int,string>(3,“小張”) );
  4. 通過 pair 的方式插入對象 mapStu.inset(make_pair(-1,“校長-1”));
  5. 通過 value_type 的方式插入對象 mapStu.insert( map<int,string>::value_type(1,“小李”) );
  6. 通過數組的方式插入值 mapStu[3]=“小劉"; mapStu[5]=“小王";
   void test01(){map<int, int>m;//插入值//4種方式//第一種m.insert(pair<int, int>(1, 10));//第二種m.insert(make_pair(2, 20));//第三種m.insert(map<int, int>::value_type(3, 30));//第四種 如果保證key存在,可以通過這種方式訪問m[4] = 40;for (map<int, int >::iterator it = m.begin(); it != m.end(); it++){cout << "key=" << it->first << "value" << it->second << endl;}if (m.empty()){cout << "空" << endl;}else{cout << "size=" << m.size() << endl;}}

注意

  1. 前三種方法,采用的是 insert()方法,該方法返回值為 pair<iterator,bool>
  2. 第四種方法非常直觀,但存在一個性能的問題。插入 3 時,先在 mapStu 中查找主 鍵為 3 的項,若沒發現,則將一個鍵為 3,值為初始化值的對組插入到 mapStu 中, 然后再將值修改成“小劉”。若發現已存在 3 這個鍵,則修改這個鍵對應的 value
  3. stringstrName=mapStu[2]; //取操作或插入操作
  4. 只有當 mapStu 存在 2 這個鍵時才是正確的取操作,否則會自動插入一個實例,鍵 為 2,值為初始化值。
  //指定排序規則class myCompare{public:bool operator()(int v1, int v2){return v1 > v2;}};void test03(){//從大到小排序map<int, int,myCompare>m;m.insert(pair<int, int>(1, 10));m.insert(make_pair(2, 20));m.insert(map<int, int>::value_type(3, 30));m[4] = 40;for (map<int, int, myCompare>::iterator it = m.begin(); it != m.end(); it++){cout << "key:" << it->first << "value:" << it->second << endl;}}

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

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

相關文章

mknod指令詳解

mknod - make block or character special files mknod [OPTION]... NAME TYPE [MAJOR MINOR] option 有用的就是 -m 了 name 自定義 type 有 b 和 c 還有 p 主設備號 次設備號 主設備號是由linux/major.h定義的&#xff0c;如下定義了一個DOC設備&am…

c++中容器(STL)的共性與使用的時機

容器的共通能力 C模板是容器的概念 理論提高&#xff1a;所有容器提供的都是值&#xff08;value&#xff09;語意&#xff0c;而非引用&#xff08;reference&#xff09;語意。容器執 行插入元素的操作時&#xff0c;內部實施拷貝動作。所以 STL 容器內存儲的元素必須能夠被…

Qt Creator 窗體控件自適應窗口大小布局

常見的軟件窗口大小改變&#xff08;最大化、手動改變時&#xff09;需要窗口的部件能夠自適應布局&#xff0c;而在Qt的應用程序界面設計中&#xff0c;對于像我一樣的初學者如何實現窗口自適應調整還是要繞點彎路的。網上百度了很多&#xff0c;多數說的很含糊&#xff0c;還…

c++中利用STL實現公司員工分組問題

#include<iostream>using namespace std; #include<vector> #include<string> #include<map> #include<ctime> /* 公司招聘了5個員工&#xff0c;5名員工進入公司之后&#xff0c;需要指派員工在那個部門工作 的人員信息&#xff1a;姓名 年齡 電…

c++中STL的常用算法--1(函數對象,謂詞,內建函數對象)

函數對象 重載函數調用操作符的類&#xff0c;其對象常稱為函數對象&#xff08;function object&#xff09;&#xff0c;即它們是行為類似函數的對象&#xff0c;也叫仿函數&#xff08;functor&#xff09;&#xff0c;其實就是重載"()"操作符&#xff0c;使得類…

QT子線程與主線程的信號槽通信

最近用QT做一個服務器&#xff0c;眾所周知&#xff0c;QT的主線程必須保持暢通&#xff0c;才能刷新UI。所以&#xff0c;網絡通信端采用新開線程的方式。在涉及到使用子線程更新Ui上的控件時遇到了點兒麻煩。網上提供了很多同一線程不同類間采用信號槽通信的方式&#xff0c;…

ubuntu14.04 通過PPA 安裝ffmpeg

去ffmpeg的官網可以獲取到最新的PPA信息 http://www.ffmpeg.org/download.html 根據系統選擇對應的PPA 然后執行以下語句&#xff1a; sudo add-apt-repository ppa:mc3man/trusty-media sudo apt-get updatesudo apt-get install ffmpeg 如果在安裝過程中發生了錯誤&#…

c++中的函數適配器

函數適配器 函數適配器概念 STL中定義了大量的函數對象&#xff0c;但是有時候需要對函數返回值進行進一步的簡單計算&#xff0c;或者填上多余的參數&#xff0c;不能直接代入算法&#xff0c;函數適配器實現了這一功能&#xff0c;將一種函數對象轉化為另一種符合要求的函數…

c++中STL的常用算法---2(遍歷算法,查找算法)

算法概述 算法主要由頭文件組成是所有STL頭文件中最大的一個&#xff0c;其中常用的功能涉及到比較&#xff0c;交換&#xff0c;查找&#xff0c;遍歷&#xff0c;復制&#xff0c;修改&#xff0c;反轉&#xff0c;排序&#xff0c;合并等體積很小&#xff0c;只包括在幾個序…

c++中的STL的常用算法---3(排序算法,拷貝和替換算法,算術生成算法,集合算法)

排序算法 merge() 以下是排序和通用算法&#xff1a;提供元素排序策略 merge: 合并兩個有序序列&#xff0c;存放到另一個序列。 #include<iostream>using namespace std; #include<algorithm> #include<vector>void test01() {vector<int >v1;vecto…

c++中STL實現演講比賽流程

演講比賽流程 1&#xff09;某市舉行一場演講比賽&#xff0c;共有 24 個人參加&#xff0c;按參加順序設置參賽號。比賽共三輪&#xff0c;前兩 輪為淘汰賽&#xff0c;第三輪為決賽。 2&#xff09;比賽方式&#xff1a;分組比賽 第一輪分為 4 個小組&#xff0c;根據參賽號…

c++實現貪吃蛇

游戲中的實現元素 游戲中元素分為&#xff1a;墻壁&#xff0c;蛇&#xff0c;事物以及蛇的可行區域和右側的版本號和游戲玩法提示 墻壁 *號表示&#xff0c;代表一個區域范圍&#xff0c;也就是蛇的可移動區域&#xff0c;蛇如果碰到墻壁視為死亡&#xff0c; 蛇 分為蛇頭&a…

Linux系統編程--1(進程和程序,CPU和MMU,PCB,進程狀態)

進程相關概念 程序和進程 程序&#xff1a;是指編譯好的二進制文件&#xff0c;在磁盤上&#xff0c;不占用系統資源(cpu、內存、打開的文件、設備、鎖…) 進程&#xff1a;是一個抽象的概念&#xff0c;與操作系統原理聯系緊密。進程是活躍的程序&#xff08;程序員角度&…

C++STL學習

1. STL介紹標準模板庫STL是當今每個從事C編程的人需要掌握的技術&#xff0c;所有很有必要總結下本文將介紹STL并探討它的三個主要概念&#xff1a;容器、迭代器、算法。STL的最大特點就是&#xff1a;數據結構和算法的分離&#xff0c;非面向對象本質。訪問對象是通過象指針一…

Linux系統編程--2(環境變量,進程控制)

環境變量 環境變量 是指在操作系統中用來指定操作系統運行環境的一些參數 每個人用電腦的習慣不一樣&#xff0c;比如一般把文件放到磁盤&#xff0c;怎么管理文件&#xff0c;用什么編譯器&#xff0c;所以&#xff0c;環境變量就是根據每個人使用操作系統的習慣來規定一些參…

STL-vector

STL學習之二 序列容器&#xff08;vector&#xff09;一、C標準模板庫提供了三種序列容器&#xff1a;vector、list、deque。類模板vector和deque都以數組為基礎&#xff0c;類模板list實現了鏈表的數據結構。STL中最流行的是類模板vector&#xff0c;它是一種更健壯的數據類型…

套接字編程--1(UDP協議編程,端口號,傳輸層協議,網絡字節序)

傳輸層的協議&#xff1a; ip地址&#xff1a; 在網絡中唯一標識一臺主機 IPV4&#xff1a;uint32_t DHCP NATIPV6 : uint8_t addr[16] —向前并不兼容IPV4 每一條數據都必須包含源地址和目的地址&#xff1a;因為每條網絡中的數據都必須確定是從那個主機來到那個主機去 端…

ARP簡單介紹

ARP簡介 ARP&#xff08;Address Resolution Protocol&#xff09;用于將IP地址解析為MAC地址 1. ARP地址解析的必要性 IP地址不能直接用來進行通信&#xff0c;因為網絡設備只能識別MAC地址。IP地址只是主機在網絡層中的地址&#xff0c;如果要將網絡層中傳送的數據報交給…

Linux系統編程--3(exec 函數族,僵尸進程和孤兒進程,wait和wait_pid回收子進程)

exec 函數族 fork 創建子進程后執行的是和父進程相同的程序&#xff08;但有可能執行不同的代碼分支&#xff09; &#xff0c;子進程往往要調用一種 exec 函數以執行另一個程序。當進程調用一種 exec 函數時&#xff0c;該進程的用戶空間代碼和數據完全被新程序替換&#xff…