C++進階-- map和set

關聯式容器

在前面,我們所學的vector、list、deque,這些都是序列容器,也就是底層為線性序列的數據結構。
而關聯式容器是C++標準庫中的一種類別,用于存儲鍵值對(key-value pair),關聯式容器中的元素中的元素是按照鍵值進行有序存儲的,同時也支持快速查找、插入、修改等操作。而map和set就是主要的類型;

這些關聯式容器在實現上通常采用平衡二叉搜索樹或哈希表等數據結構來保證元素的有序性和高效的查找性能。

鍵值對

鍵值對是關聯式容器中的一種結構,它由一個鍵(key)和一個對應值(value)組成。在關聯式容器中,每個元素都有一個唯一的鍵,用于標識和訪問該元素。鍵值對的特性使得關聯式容器能夠通過鍵快速查找、插入、刪除。

在關聯式容器中,鍵通常用于確定元素的順序和唯一性,而值則是與鍵關聯的數據。鍵和值可以是任何類型,但通常使用類或結構體作為鍵類型,以提供自定義的比較規則。通過比較鍵的值,關聯式容器能夠按照鍵的順序進行有序存儲,并支持快速的查找操作。

鍵值對的定義:

template <class T1, class T2>
struct pair
{
typedef T1 first_type;
typedef T2 second_type;
T1 first;
T2 second;
pair(): first(T1()), second(T2())
{}
pair(const T1& a, const T2& b): first(a), second(b)
{}
};

set

介紹

set是C++標準庫中的一種關聯式容器,它用于存儲一組有序的、唯一的元素。set中的元素按照鍵值進行自動排序,并且不允許存在重復的元素

set在底層是由二叉搜索樹(紅黑樹)實現的。
set中只放value,但在底層實際存放的是由<vlaue,value> 構成的鍵值對。

set中查找某個元素時,時間復雜度為:log_2 n .

使用

在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

void test1()
{set<int> s;s.insert(1);s.insert(3);s.insert(3);s.insert(4);s.insert(6);s.insert(9);s.insert(7);set<int>::iterator it = s.begin();while (it != s.end()){cout << *it << " " ;it++;}cout << endl;// 使用迭代器逆向打印set中的元素for (auto it = s.rbegin(); it != s.rend(); ++it){cout << *it << " ";}cout << endl;set<int>::iterator pos = s.find(7);if (pos != s.end()){cout << "找到了" << endl;s.erase(pos);}}

在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

void test2()
{set<int> s;s.insert(1);s.insert(3);s.insert(3);//s.insert(4);s.insert(6);s.insert(9);s.insert(7);auto start = s.lower_bound(4);cout << *start << endl;auto finish = s.upper_bound(4);cout << *finish << endl;
}

在這里插入圖片描述
在這里插入圖片描述

muiltiset

multisetsC++標準庫中的一種關聯式容器,它與set容器類似,但允許存儲重復的元素
muiltiset容器和set容器的主要區別在于對重復元素的處理。在set容器中,每個鍵值只能出現一次,而在muitiset容器中,同一個鍵值可以出現多次。multisey中的元素會根據鍵值自動進行排序。

void test3()
{multiset<int> s;s.insert(5);s.insert(1);s.insert(6);s.insert(3);s.insert(4);s.insert(5);s.insert(1);s.insert(1);s.insert(5);s.insert(1);s.insert(1);s.insert(2);s.insert(7);s.insert(10);multiset<int>::iterator it = s.begin();while (it != s.end()){cout << *it << " ";++it;}cout << endl;//統計相同元素的個數cout << s.count(1) << endl;cout << s.count(5) << endl;
}

在這里插入圖片描述

map

介紹

map是C++標準庫中的一種關聯式容器,它用于存儲一組鍵值對每個元素都由一個唯一的鍵和對應的值組成。map中的元素按照鍵進行自動排序,并且不允許存在重復鍵

在map內部,key和value通過成員類型value_type綁定在一起,為其取別名為pair;

typedef pair<const key,T> value_type;

map支持下標訪問符,即在[]中放入key,就可以找到與key對應的value值;

map通常被實現為二叉搜索樹(平衡二叉搜索樹).

使用

在這里插入圖片描述

void test4()
{map<string, string> dict;dict.insert(pair<string, string>("sort", "排序"));//pair<string, string> kv("string", "字符串");pair<string, string> kv = { "string", "字符串" };dict.insert(kv);// C++11 多參數隱式類型轉換(構造函數)dict.insert({ "apple", "蘋果" });// C++98dict.insert(make_pair("sort", "排序"));for (auto& kv : dict){cout << kv.first << ":" << kv.second << endl;}cout << endl;
}

在這里插入圖片描述

void test5()
{string arr[] = { "蘋果", "西瓜", "蘋果", "西瓜", "蘋果", "蘋果", "西瓜",
"蘋果", "香蕉", "蘋果", "西瓜", "香蕉", "草莓" };map<string, int> countMap;for (auto& e : arr){countMap[e]++;}for (auto& kv : countMap){cout << kv.first << ":" << kv.second << endl;}cout << endl;//通過operator[]進行查找value值cout << countMap["蘋果"] << endl;
}

在這里插入圖片描述

在這里插入圖片描述

multimap

multimapC++標準庫中的一種關聯式容器,它與map容器類似,但允許存儲重復的鍵

multimap容器和map容器的主要區別在于對重復鍵的處理方式。在multimap中,可以有很多個元素具有相同的鍵,這些元素會按照鍵進行自動排序,但不保證值的順序

multimap中沒有重載operator[]操作;
使用時與map包含的頭文件相同。

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

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

相關文章

vxe-table編輯單元格動態插槽slot的使用

業務場景&#xff1a;表格中只有特定某一行的的單元格可以編輯&#xff0c;列很多&#xff0c;為每個列寫個插槽要寫很多重復代碼&#xff0c;所以這里使用動態插槽&#xff0c;簡化代碼量。顯示編輯圖標&#xff0c;點擊編輯圖標隱藏。失去焦點保存調后臺接口。 解決辦法&…

Linux多線程服務端編程:使用muduo C++網絡庫 學習筆記 附錄C 關于Boost的看法

這是作者為電子工業出版社出版的《Boost程序庫完全開發指南》寫的推薦序&#xff0c;此處節選了作者對在C工程項目中使用Boost的看法。 最近一年&#xff08;這篇文章寫于2010年8月&#xff09;作者電話面試了數十位C應聘者。慣用的暖場問題是“工作中使用過STL的哪些組件&…

十行代碼開發一個AI應用

Semantic Kernal 簡介 Semantic Kernel (SK) is a lightweight SDK that lets you easily mix conventional programming languages with the latest in Large Language Model (LLM) AI "prompts" with templating, chaining, and planning capabilities out-of-the-…

關于vue中關于eslint報錯的問題

1 代碼保存的時候會自動將單引號報錯為雙引號 導致eslint報錯的問題&#xff0c; 解決思路&#xff1a; 在項目根目錄下新建一個.prettierrc.json文件 { “tabWidth”: 2,“useTabs”: false,“singleQuote”: true,“semi”: false} 2 關于報錯代碼的時候 出現尾隨逗號報錯…

Zabbix 系統告警“More than 75% used in the configuration cache”處理辦法

Zabbix系統報錯提示 Zabbix 系統告警“More than 75% used in the configuration cache”&#xff0c;看了一下意思是可用的配置緩存超過75%。 修改緩存大小 vim /etc/zabbix/zabbix_server.confesc : /CacheSize 找到配置 將64M改大一點&#xff0c;保存退出。 重啟zabbix…

WPF常用mvvm開源框架介紹 vue的mvvm設計模式鼻祖

WPF&#xff08;Windows Presentation Foundation&#xff09;是一個用于構建桌面應用程序的.NET框架&#xff0c;它支持MVVM&#xff08;Model-View-ViewModel&#xff09;架構模式來分離UI邏輯和業務邏輯。以下是一些常用的WPF MVVM開源框架&#xff1a; Prism Prism是由微軟…

代碼隨想錄算法訓練營 Day32 | LeetCode122.買賣股票的最佳時機II、LeetCode55. 跳躍游戲、LeetCode45.跳躍游戲II

LeetCode122.買賣股票的最佳時機II 那么這里面根據貪心思想&#xff1a; 1、在最低點時買入&#xff0c;如果該點比上一點價格更低&#xff0c;只有兩種情況&#xff1a;上一點為買入點&#xff0c;則此時更新買入點&#xff1b;上一點不是買入點&#xff0c;則此時將股票賣出…

物聯網的核心技術有哪些?

物聯網的核心技術有哪些? 說起物聯網的相關技術&#xff0c;涉及到很多&#xff0c;比如自動識別技術、傳感器技術、網絡通信技術、云計算等&#xff0c;但說到核心技術&#xff0c;我認為有以下6個。這6個核心技術分別是感知和識別技術、物聯網設備硬件、通信技術、數據處理技…

【MySQL】數據庫中常用的函數

目錄 聚合函數COUNT()函數的多種用法COUNT(*)COUNT(主鍵)COUNT(1)COUNT(常量)COUNT(非主鍵)COUNT(distinct(字段)) COUNT()函數小結 字符函數length(str)函數&#xff1a;獲取參數值的字節個數concat(str1,str2,...)函數&#xff1a;字符串拼接upper(str)、lower(str)函數:大小…

Linux高負載排查最佳實踐

在Linux系統中&#xff0c;經常會因為負載過高導致各種性能問題。那么如何進行排查&#xff0c;其實是有跡可循&#xff0c;而且模式固定。 本次就來分享一下&#xff0c;CPU占用過高、磁盤IO占用過高的排查方法。 還是那句話&#xff0c;以最佳實踐入手&#xff0c;真傳一句話…

1 開源鴻蒙OpenHarmony niobe407 STM32F407IGT6芯片輕型系統全量源碼4.1版本下載流程

開源鴻蒙OpenHarmony niobe407 STM32F407IGT6芯片輕型系統全量源碼4.1版本下載流程 作者將狼才鯨日期2024-02-27 一、前景提要 如果通過DevEco Marketplace網站獲取下載源碼的話&#xff0c;不全&#xff0c;有些板子下不到&#xff1b;OpenHarmony開發板列表&#xff0c;官方…

數據庫-第二/三章 關系數據庫和標準語言SQL【期末復習|考研復習】

前言 總結整理不易&#xff0c;希望大家點贊收藏。 給大家整理了一下計數據庫系統概論中的重點概念&#xff0c;以供大家期末復習和考研復習的時候使用。 參考資料是王珊老師和薩師煊老師的數據庫系統概論(第五版)。 文章目錄 前言第二、三章 關系數據庫和標準語言SQL2.1 關系2…

JVM原理-基礎篇

Java虛擬機&#xff08;JVM, Java Virtual Machine&#xff09;是運行Java應用程序的核心組件&#xff0c;它是一個抽象化的計算機系統模型&#xff0c;為Java字節碼提供運行環境。JVM的主要功能包括&#xff1a;類加載機制、內存管理、垃圾回收、指令解釋與執行、異常處理與安…

React react.fragment和<>的使用及區別

React一個常用的模式是組件返回多個元素。Fragment可以為你的子元素分組而不需要在DOM上為它們添加額外的節點。 Fragment 使用 render() {return (<React.Fragment> <ChildA /> <ChildB /> <ChildC /> </React.Fragment> );}短語法使用 這里…

虛擬機內存不夠用了?全流程操作Look一下?

虛擬機信息&#xff1a;操作系統&#xff1a;CentOS Linux 7 (Core)&#xff0c;用的是VMware Workstation 16 Pro 版本16.2.3 build-19376536&#xff1b;我的主機 Windows 10 Education, 64-bit (Build 22000.1817) 10.0.22000 前言&#xff1a;虛擬機用久了就會出現內存不足…

代碼隨想錄算法訓練營Day37|738.單調遞增的數字、968.監控二叉樹

738.單調遞增的數字 題目鏈接&#xff1a;738.單調遞增的數字 文檔鏈接&#xff1a;738.單調遞增的數字 視頻鏈接&#xff1a;貪心算法&#xff0c;思路不難想&#xff0c;但代碼不好寫&#xff01;LeetCode:738.單調自增的數字 C實現 class Solution { public:int monotoneIn…

Rocky Linux 安裝部署 Zabbix 6.4

一、Zabbix的簡介 Zabbix是一種開源的企業級監控解決方案&#xff0c;用于實時監測服務器、網絡設備和應用程序的性能和可用性。它提供了強大的數據收集、處理和可視化功能&#xff0c;同時支持事件觸發、報警通知和自動化任務等功能。Zabbix易于安裝和配置&#xff0c;支持跨平…

6、Redis-KV設計、全局命令和安全性

目錄 一、value設計 二、Key設計 三、全局命令——針對所有key 四、安全性 一、value設計 ①是否需要排序&#xff1f;需要&#xff1a;Zset ②需要緩存的數據是單個值還是多個值&#xff1f; 單個值&#xff1a;簡單值---String&#xff1b;對象值---Hash多個值&#x…

【前端素材】推薦優質后臺管理系統網頁Hyper平臺模板(附源碼)

一、需求分析 1、系統定義 后臺管理系統是一種用于管理和控制網站、應用程序或系統的管理界面。它通常被設計用來讓網站或應用程序的管理員或運營人員管理內容、用戶、數據以及其他相關功能。后臺管理系統是一種用于管理網站、應用程序或系統的工具&#xff0c;通常由管理員使…

【AIGC】OpenAI推出王炸級模型sora,顛覆AI視頻行業(2024)

對于OpenAI推出的Sora模型&#xff0c;我們可以進一步探討其可能的技術細節、潛在應用以及對AI視頻行業的影響。 點擊以下任一云產品鏈接&#xff0c;跳轉后登錄&#xff0c;自動享有所有云產品優惠權益&#xff1a; 經過筆者親測&#xff0c;強烈推薦騰訊云輕量應用服務器作…