STL常見容器(map/multimap容器)---C++

STL常見容器目錄:

  • 8.map/ multimap容器
    • 8.1 map基本概念
    • 8.2 map構造和賦值
    • 8.3 map大小和交換
    • 8.4 map插入和刪除
    • 8.5 map查找和統計
    • 8.6 map容器排序
      • 8.6.1 內置類型排序
      • 8.6.2 自定義類型排序
      • 8.6.3 自定義和內置類型混合排序

在這里插入圖片描述

8.map/ multimap容器

兩者基本一致,除了以下區別:

map和multimap區別

  • map不允許容器中有重復key值元素;
  • multimap允許容器中有重復key值元素。
    注意:對于value值都可以重復

8.1 map基本概念

簡介:

  • map中所有元素都是pair
  • pair中第一個元素為key(鍵值),起到索引作用,第二個元素為value(實值)(可以根據key值快速找到value值);
  • 所有元素都會根據元素的鍵值自動排序

本質:

  • map/multimap屬于關聯式容器,底層結構是用二叉樹實現(同set容器)。

8.2 map構造和賦值

構造:

  • map<T1, T2> mp; //map默認構造函數:
  • map(const map &mp); //拷貝構造函數

賦值:

  • map& operator=(const map &mp); //重載等號操作符

總結:map中所有元素都是成對出現,插入數據時候要使用對組

8.3 map大小和交換

函數原型:

  • size(); //返回容器中元素的數目
  • empty(); //判斷容器是否為空
  • swap(st); //交換兩個集合容器

8.4 map插入和刪除

函數原型:

  • insert(elem); //在容器中插入元素(四種方式)。
  • clear(); //清除所有元素
  • erase(pos); //刪除pos迭代器所指的元素,返回下一個元素的迭代器。
  • erase(beg, end); //刪除區間[beg,end)的所有元素 ,返回下一個元素的迭代器。
  • erase(key); //刪除容器中值為key的元素

示例:

#include <map>//包含頭文件(multimap頭文件一樣)void Printmap(map<int, int>m)//按照key值排序(默認升序)
{for (map<int,int>::iterator it = m.begin(); it != m.end(); it++) {cout << "key=" << (*it).first << " value= " << it->second << endl;;}cout << endl;
}
void test01()
{map<int, int>m;//四種插入方式(多用前兩種)m.insert(pair<int, int>(9, 90));//pair匿名對象m.insert(make_pair(8, 80));m.insert(map<int, int>::value_type(7, 70));m[6] = 60;//key=6,value=60Printmap(m);
cout << "方括號訪問元素:" << m[9] << endl;//可利用[key]訪問對于value值m.erase(7);//刪除key=7的元素(若無相應key值,則不刪除)Printmap(m);}

在這里插入圖片描述

8.5 map查找和統計

函數原型:

  • find(key); //查找key是否存在,若存在,返回該鍵的元素的迭代器若不存在,返回set.end();
  • count(key); //統計key的元素個數(map返回0或1;mutimap可能大于1

8.6 map容器排序

主要技術點:

  • 利用仿函數,可以改變排序規則。(默認升序)

8.6.1 內置類型排序

示例:

#include <map>class MyCompare {
public:bool operator()(int v1, int v2) const {return v1 > v2;//降序}
};void test02()
{//默認從小到大排序//利用仿函數實現從大到小排序map<int, int, MyCompare> m;m.insert(make_pair(1, 10));m.insert(make_pair(2, 20));m.insert(make_pair(3, 30));m.insert(make_pair(4, 40));m.insert(make_pair(5, 50));for (map<int, int, MyCompare>::iterator it = m.begin(); it != m.end(); it++) {cout << "key:" << it->first << " value:" << it->second << endl;}
}

輸出;

key:5 value:50
key:4 value:40
key:3 value:30
key:2 value:20
key:1 value:10

8.6.2 自定義類型排序

示例:

class Person
{
public:Person(string name, int age){this->m_Name = name;this->m_Age = age;}string m_Name;int m_Age;};
//仿函數
class MyCompare
{
public:bool operator()(const Person& v1, const Person& v2) const{//按照年齡進行排序  降序return v1.m_Age > v2.m_Age;}
};void test03()
{//指定排序規則 map<Person,Person, MyCompare> m;//改變排序順序需要在插入數據之前改變//插入自定義數據Person p1("劉備", 23);Person p2("關羽", 27);Person p3("張飛", 25);Person p4("趙云", 21);m.insert(make_pair(p1,p1));m.insert(make_pair(p2,p2));m.insert(make_pair(p3,p3));m.insert(make_pair(p4,p4));for (map<Person, Person, MyCompare>::iterator it = m.begin(); it != m.end(); it++) {cout << "姓名:" << it->second.m_Name << " 年齡:" << it->second.m_Age << endl;}
}

輸出:

姓名:關羽 年齡:27
姓名:張飛 年齡:25
姓名:劉備 年齡:23
姓名:趙云 年齡:21

8.6.3 自定義和內置類型混合排序

示例:

#include <map>
class Person
{
public:Person(string name, int age){this->m_Name = name;this->m_Age = age;}string m_Name;int m_Age;};void test04()
{map<int,Person> m;//若要改變排序順序需要在插入數據之前改變//因為map排序是按照key值排序,此處key為整型,編譯器可自行排序(升序)//降序參照8.6.1//插入自定義數據Person p1("劉備", 23);Person p2("關羽", 27);Person p3("張飛", 25);Person p4("趙云", 21);m.insert(make_pair(p1.m_Age,p1));m.insert(make_pair(p2.m_Age, p2));m.insert(make_pair(p3.m_Age, p3));m.insert(make_pair(p4.m_Age, p4));for (map<int, Person>::iterator it = m.begin(); it != m.end(); it++) {cout << "姓名:" << it->second.m_Name << " 年齡:" << it->second.m_Age << endl;}
}

輸出:

姓名:趙云 年齡:21
姓名:劉備 年齡:23
姓名:張飛 年齡:25
姓名:關羽 年齡:27

總結:

  • 利用仿函數可以指定map容器的排序規則;
  • 對于自定義數據類型,map必須要指定排序規則,同set容器;

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

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

相關文章

用node寫后端環境運行時報錯Port 3000 is already in use

解決方法:關閉之前運行的3000端口,操作如下 1.WindowR輸入cmd確定,打開命令面板 2.查看本機端口詳情 netstat -ano|findstr "3000" 3.清除3000端口 taskkill -pid 41640 -f 最后再重新npm start即可,這里要看你自己項目中package.joson的啟動命令是什…

Flink:動態表 / 時態表 / 版本表 / 普通表 概念區別澄清

博主歷時三年精心創作的《大數據平臺架構與原型實現&#xff1a;數據中臺建設實戰》一書現已由知名IT圖書品牌電子工業出版社博文視點出版發行&#xff0c;點擊《重磅推薦&#xff1a;建大數據平臺太難了&#xff01;給我發個工程原型吧&#xff01;》了解圖書詳情&#xff0c;…

Python+PySide6實現一個選擇文件并做處理的GUI辦公小工具(完整代碼)

目錄 專欄導讀背景安裝注意事項完整代碼結尾專欄導讀 ?? 歡迎來到Python辦公自動化專欄—Python處理辦公問題,解放您的雙手 ?????? 博客主頁:請點擊——> 一晌小貪歡的博客主頁求關注 ?? 該系列文章專欄:請點擊——>Python辦公自動化專欄求訂閱 ?? 此外還…

天翼云登錄參數JavaSrcipt逆向

天翼云登錄參數 password 、comParam_curTime、comParam_seqCode、comParam_signature JavaSrcipt逆向 目標網站 https://m.ctyun.cn/wap/main/auth/login?redirect/my 目標參數 要逆向的有 password、comParam_curTime、comParam_seqCode、comParam_signature 四個參數 …

安卓使用ExoPlayer出現膨脹類異常

1.導包 implementation com.google.android.exoplayer:exoplayer-core:2.15.1implementation com.google.android.exoplayer:exoplayer-ui:2.15.1 2.在Androidifest.xml加入權限&#xff0c;我這里加了忘了與讀寫權限 <uses-permission android:name"android.permissio…

【Fastadmin/ThinkPHP5】使用Queue隊列方法詳細步驟

在現代應用開發中&#xff0c;合理利用隊列系統能夠有效提升系統的性能和響應速度&#xff0c;尤其是在處理耗時較長的任務時&#xff0c;如發送大量郵件、執行定時任務等。下面是如何在ThinkPHP框架中設置和使用隊列功能的詳細指南&#xff1a; 1.配置隊列服務 在applicatio…

Tomcat服務部署、優化

一 Tomcat的基本介紹 Tomcat概念 Tomcat 服務器是一個免費的開放源代碼的Web 應用服務器&#xff0c;屬于輕量級應用服務器&#xff0c;在中小型系統和并發訪問用戶不是很多的場合下被普遍使用&#xff0c;是開發和調試 JSP 程序的首選。 當在一臺機器上配置好Apache 服務器…

VMwareWorkstation17.0虛擬機搭建WindowsXP虛擬機(完整安裝步驟詳細圖文教程)

VMwareWorkstation17.0虛擬機搭建WindowsXP虛擬機&#xff08;完整安裝步驟詳細圖文教程&#xff09; 一、Windows XP1.Windows XP簡介2.Windows XP 的下載地址 二、配置 Windows XP 虛擬機運行環境1.新建虛擬機2.選擇類型配置3.插入WinXP光盤映像文件(ISO)4.選擇操作系統5.命名…

Home Assistant:基于Python的智能家居開源系統詳解

Home Assistant&#xff1a;基于Python的智能家居開源系統詳解 在數字化和智能化的時代&#xff0c;智能家居系統成為了現代家庭的新寵。它們能夠讓我們更加方便地控制家中的各種設備&#xff0c;實現自動化和個性化的居住體驗。其中&#xff0c;Home Assistant作為一款基于Pyt…

美易官方:3月1日美股成交額前20

3月1日&#xff0c;美股市場熱鬧非凡&#xff0c;成交額前20的公司股票交易活躍&#xff0c;其中&#xff0c;英偉達&#xff08;NVIDIA&#xff09;的股價收在800美元之上&#xff0c;創下了歷史新高。這一天的股市走勢充分展示了投資者對于科技股的熱烈追捧&#xff0c;同時也…

手機NFC錄入門禁數據,實現手機開門

近場通信&#xff08;Near Field Communication&#xff0c;簡稱NFC&#xff09;&#xff1a; 是一種新興的技術&#xff0c;使用了NFC技術的設備&#xff08;例如移動電話&#xff09;可以在彼此靠近的情況下進行數據交換&#xff0c;是由非接觸式射頻識別&#xff08;RFID&am…

【二分】二分模板+二分題目

一、樸素二分 . - 力扣&#xff08;LeetCode&#xff09;. - 備戰技術面試&#xff1f;力扣提供海量技術面試資源&#xff0c;幫助你高效提升編程技能,輕松拿下世界 IT 名企 Dream Offer。https://leetcode.cn/problems/binary-search/description/ int left 0, right nums.…

【leetcode】隨機鏈表的復制

大家好&#xff0c;我是蘇貝&#xff0c;本篇博客帶大家刷題&#xff0c;如果你覺得我寫的還不錯的話&#xff0c;可以給我一個贊&#x1f44d;嗎&#xff0c;感謝?? 點擊查看題目 思路: struct Node* copyRandomList(struct Node* head) {struct Node* curhead;//1.copy原鏈…

MWC 2024丨美格智能CEO杜國彬出席中國聯通創新成果發布會并發表主題演講

2月26日&#xff0c;中國聯通在MWC2024 巴塞羅那期間舉辦了以“算網為基&#xff0c;智領未來”為主題的創新成果發布會&#xff0c;集中展示最新的創新成果與最佳實踐。 中國通信標準化協會理事長聞庫、GSMA首席財務官Louise Easterbrook、中國聯通副總經理梁寶俊、華為ICT銷…

每日一“類“:深入理解Qt的心臟《QObject》

Qt框架以其強大的跨平臺能力和豐富的用戶界面元素而廣受開發者歡迎&#xff0c;而QObject類無疑是Qt框架心臟的所在。本文將深入探討QObject&#xff0c;揭示其提供的核心功能以及如何在Qt項目中有效利用這個基類。 核心功能 信號與槽 Qt獨特的信號與槽機制是其事件通信的基…

AWS 認證報名考試流程

AWS認證的考試包括&#xff0c;可以申請線上或者線下考試。 考試類型 線上&#xff1a; 優點&#xff1a;方便快捷無需通勤&#xff0c;隨時約隨時考&#xff0c;基本上每天都可以 缺點&#xff1a;對環境要求較高&#xff0c;屋子里只能有自己&#xff0c;而且不能有其他聲音…

yolov9 瑞芯微芯片rknn部署、地平線芯片Horizon部署、TensorRT部署

特別說明&#xff1a;參考官方開源的yolov9代碼、瑞芯微官方文檔、地平線的官方文檔&#xff0c;如有侵權告知刪&#xff0c;謝謝。 模型和完整仿真測試代碼&#xff0c;放在github上參考鏈接 模型和代碼。 之前寫過yolov8檢測、分割、關鍵點模型的部署的多篇博文&#xff0c;y…

如何安裝VM ware 17 pro 和Ubuntu安裝

下載VM ware軟件 下載地址&#xff1a;Windows VM | Workstation Pro | VMware按步驟安裝&#xff0c;安裝成功后&#xff0c;打開軟件&#xff0c;填寫證書秘鑰 秘鑰&#xff1a;MC60H-DWHD5-H80U9-6V85M-8280D&#xff08;親測有效&#xff09;下載ubuntu 參考博客&#xff1…

軟考中級 軟件設計師備考經驗

考試介紹 軟考中級的軟件設計師需要考兩個部分&#xff0c;選擇題和大題&#xff0c;每科滿分75&#xff0c;需要在同一次考試中兩科同時大于等于45分才算通過。考試的內容包括計算機組成原理、數據結構、數據庫、專業英語、信息安全、計算機網絡等&#xff0c;范圍比較廣但考…

Linux中systemv共享內存

目錄 1.原理 2.接口 1.shmget(share_memory_get獲得共享內存) 2.ftok 3.shmat(share_memory_attaintion掛接到物理內存上) 4.key和shmid的區別 5.ipc 指令 6.shmdt函數&#xff08;share_memory_detach取消掛接&#xff09; 7.shmctl函數&#xff08;share_memory_cont…