C++ 之 【簡介 set、multiset、map、multimap 的使用】

?

目錄

1.序列式、關聯式容器

2.鍵值對

3.set

3.1set的簡介

3.2set的常用函數

4.multiset

5.map

5.1map的簡介

5.2map的常用函數

6.multimap

7.練習題


?

1.序列式、關聯式容器

vector、deque、list、forward_list、array等是C++STL中的序列式容器

其核心特性是?元素按插入順序存儲,支持高效的順序訪問或隨機訪問

set、map、multiset、multimap等是C++STL中的關聯式容器

其核心特性是?元素通過鍵(key)進行排序和快速查找,而不是像序列式容器那樣按插入順序存儲

2.鍵值對

鍵值對是一種數據結構,由唯一的鍵 Key?對應的值 Value?組成
鍵 Key :唯一標識符,用于快速定位數據且必須是不可變類型(如字符串、數字、元組等)

值 Value? :存儲的實際數據,可以是任意類型(字符串、數字、列表、字典等)

映射關系:一個鍵對應一個值,形成 key: value 的結構

鍵值對主要通過?標準模板庫(STL)?中的?std::pair?和關聯容器(如?std::mapstd::unordered_map)實現,下面是STL中的定義

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){}};

容器更詳細的使用請參考cplusplus.com - The C++ Resources Network

3.set

3.1set的簡介

set容器實際上就是二叉搜索樹應用中說的 K模型

T: set中存放元素的類型(實際在底層存儲的鍵值對)

Compare(仿函數):set中元素默認按照小于來比較

Alloc:set中元素空間的管理方式,使用STL提供的空間配置器管理(后續講解)

3.2set的常用函數

set自帶默認構造、迭代器區間構造、拷貝構造等成員函數

(1)insert

set支持單個元素插入在特定位置后插入以及迭代器區間范圍內元素的插入

重點講講單個元素插入的返回值

插入元素不在set中,返回pair<插入元素在set中的迭代器,true>

插入元素在set中,返回pair<插入元素在set中的迭代器,false>

從上面我們可以得出結論

set中的每個元素只能出現一次(重復插入會被忽略)

(2)

set 是基于紅黑樹(一種平衡二叉搜索樹)實現的,遍歷方式是中序遍歷且由于元素默認是按小于比較的,迭代器打印序列就是升序序列

插入元素Key不可修改

(3)find

//查找高度次
s.find(5);
//暴力查找,最多N次
find(s.begin(), s.end(), 5);

set中的find函數是根據元素大小比較查找的,最多查找樹高度次

算法庫中的find函數遍歷查找的,最多查找元素個數次

兩者:找到了,返回該位置的迭代器,找不到返回 end()

(4)count

set 中的count 也可以用來查找,返回的是元素個數

找到了返回1,找不到返回0

	if (s.count(5)){cout << "找到了" << endl;}

(5)erase

set支持特定位置的刪除特定元素的刪除以及迭代器區間范圍內元素的刪除

特定位置的刪除,傳入的 position 應屬于[ first,last ),否則系統會崩潰

正確做法

	auto pos = s.find(50);//不能越界訪問	if (pos != s.end())s.erase(pos);

特定元素的刪除,函數返回刪除的數量,這里當然是0或1啦

迭代器區間范圍內元素的刪除,范圍一定要準確,否則程序會崩潰或出現未定義行為

(6)lower_bound

iterator lower_bound (const value_type& val) const;

該函數返回 大于等于val的第一個元素的迭代器,找不到時返回 end()

(7)upper_bound

iterator upper_bound (const value_type& val) const;

該函數返回 大于val 的第一個元素的迭代器,找不到時返回 end()

set與multiset使用一致

(8)equal_range

pair<iterator,iterator> equal_range (const value_type& val) const;

pair.fisrt 就是?lower_bound 的返回值

pair.second 就是?upper_bound 的返回值

set與multiset使用一致

4.multiset

multiset與set的最大區別就是 multiset可以存儲多個相同大小的元素

multiset的插入、查找、刪除等與set類似,這里不再贅述

5.map

5.1map的簡介

set容器實際上就是二叉搜索樹應用中說的 KV模型

key: 鍵值對中key的類型
T: 鍵值對中value的類型
Compare(仿函數): 比較器的類型,map中的元素是按照key來比較的,缺省情況下按照小于來比較,一般情況下(內置類型元素)該參數不需要傳遞,如果無法比較時(自定義類型),需要用戶自己顯式傳遞比較規則(一般情況下按照函數指針或者仿函數來傳遞)
?Alloc:通過空間配置器來申請底層空間,不需要用戶傳遞,除非用戶不想使用標準庫提供的
空間配置器(后續講解)
注意:在使用map時,需要包含頭文件。

5.2map的常用函數

map自帶默認構造、迭代器區間構造、拷貝構造等成員函數

(1)insert

map插入的是一個鍵值對pair

map支持單個pair插入在特定位置后插入以及迭代器區間范圍內pair的插入

重點講講單個pair插入的返回值

插入pair的pair.fistr不在map中,返回一個鍵值對pair<插入pair在map中的迭代器,true>

插入pair的pair.fistr在map中,返回一個鍵值對pair<插入pair在map中的迭代器,false>

map中存儲的是鍵值對pair,且pair.first均不相同

map<string, string> dict;
pair<string, string> kv("insert", "插入");
dict.insert(kv);
dict.insert(pair<string, string>("copy", "復制"));
dict.insert(make_pair("right", "右邊"));
dict.insert({ "pig", "豬" });
以上4中方式都可以完成插入:有名鍵值對、匿名鍵值對、調用函數創建鍵值對、多參數構造函數創建鍵值對(C++11)
template <class T1,class T2>pair<T1,T2> make_pair (T1 x, T2 y){return ( pair<T1,T2>(x,y) );}

make_pair 函數通常可成為內聯函數,消耗較小

(2)

map?是基于紅黑樹(一種平衡二叉搜索樹)實現的,遍歷方式是中序遍歷且由于元素默認是按小于比較的(比較的是鍵值對中的鍵值Key,即第一個元素),迭代器打印序列就是升序序列

()map的其余函數與set類似,這里不再贅述,下面詳解map的operator[]函數

函數的類似實現

value& operator[](const Key& x)
{auto ret = insert(make_pair(x, value());return (ret.first)->second;
}

ret接收鍵值對<x,value()>插入的返回值:

如果x不在map中,使用value的默認構造與x組成鍵值對并插入

如果x在map中,不插入

ret:<在map中指向x所在鍵值對的迭代器,true(插入成功)\false(插入失敗)>

(ret.first)->second就是x所在鍵值對中的value

這樣 [] 就可以實現插入和修改的功能

此時,統計次數就簡潔了起來

6.multimap

multimap與map的最大區別就是 multimap可以存儲多個key值相同的的鍵值對

除了沒有 operator[],使用方法與map類似

因為operator[]可修改鍵值對中的value,多個Key值相同的的鍵值對存在時,無法確定修改哪一個鍵值對的value

7.練習題

349. 兩個數組的交集 - 力扣(LeetCode)

692. 前K個高頻單詞 - 力扣(LeetCode)

20. 有效的括號 - 力扣(LeetCode)

138. 隨機鏈表的復制 - 力扣(LeetCode)

map、set 去重+排序的特點,map的映射關系會使效率大大提升!

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

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

相關文章

數據結構——排序(升級篇:快速排序、堆排序、希爾排序、計數排序)

1. 快速排序&#xff08;Quick Sort&#xff09; 原理&#xff1a; 選擇一個基準值&#xff08;pivot&#xff09;將數組分成兩部分&#xff1a;小于 pivot 的放左邊&#xff0c;大于 pivot 的放右邊。然后遞歸處理 工作過程示例&#xff1a; 示例數組&#xff1a;[5, 3, 8, 4,…

C++:淺嘗gdb

hp window11 wsl ubuntu what is gdb&#xff1f; GNU調試器&#xff08;英語&#xff1a;GNU Debugger&#xff0c;縮寫&#xff1a;GDB&#xff09;&#xff0c;是GNU軟件系統中的標準調試器&#xff0c;此外GDB也是個具有移攜性的調試器&#xff0c;經過移攜需求的調修與…

Android輸入法一些常用的命令

Android開發過程可能會遇到Android輸入法異常的問題&#xff0c;可以通過如下命令來查看和修改系統的輸入法。方便調試。 獲取當下系統的所有輸入法 adb shell ime list獲取當前的可用輸入法 adb shell ime list -s獲取當前的輸入法 adb shell settings get secure default_inp…

Sklearn 機器學習 手寫數字識別 加載并查看數據

??親愛的技術愛好者們,熱烈歡迎來到 Kant2048 的博客!我是 Thomas Kant,很開心能在CSDN上與你們相遇~?? 本博客的精華專欄: 【自動化測試】 【測試經驗】 【人工智能】 【Python】 Sklearn 機器學習 手寫數字識別:加載并查看數據 在機器學習入門案例中,手寫數字識別…

衛星通信鏈路預算之七:上行載噪比計算

在前面的文章中我們介紹了衛星通信鏈路計算的基礎知識&#xff0c;包括&#xff1a; 信噪比分配&#xff1b; 帶寬和功帶平衡原則&#xff1b; EIRP和G/T&#xff1b; 輸入回退&#xff1b; 輸入飽和通量密度SFD&#xff1b; 輸出回退&#xff1b; 這次我們正式進入正題…

一文讀懂PDB格式

最近在做分子對接和分子模擬&#xff0c;涉及到了一些盲區&#xff0c;必去pdb文件是按照列位數儲存信息的&#xff0c;跟其他文件的空格或者制表符分割很不同&#xff0c;所以也可能出現一些錯誤&#xff0c;比如信息錯位&#xff0c;因此有必要了深入解下結構相關的格式pdb、…

進階:PGCE中級專家認證精要

PGCE中級認證的核心價值技術深度&#xff1a;掌控未來生態PostgreSQL不僅是傳統關系型數據庫的標桿&#xff0c;更是云原生、AI大模型訓練、物聯網平臺等前沿場景的核心支撐。通過PGCE認證&#xff0c;你將掌握&#xff1a;萬億級數據性能調優&#xff1a;從查詢優化器原理到執…

AI增強SEO關鍵詞表現

內容概要 隨著人工智能技術的不斷演進&#xff0c;其在搜索引擎優化領域展現出顯著潛力&#xff0c;尤其在關鍵詞表現優化方面發揮著核心作用。本文將從基礎概念入手&#xff0c;系統探討AI如何智能提升關鍵詞的搜索可見性、流量吸引力和轉化效率&#xff0c;從而驅動整體SEO策…

PG靶機 - PayDay

一、 初步偵察與服務探測 1.1 端口掃描與服務識別 首先&#xff0c;對目標主機 192.168.163.39 進行一次全面的端口掃描&#xff0c;以識別其上運行的各項服務。 sudo nmap 192.168.163.39 -p- --min-rate5000 -A圖 1: Nmap 掃描結果&#xff0c;顯示開放 80、445 和 995 等端口…

MySQLl中OFFSET 的使用方法

MySQLl中OFFSET 的使用方法基本語法SELECT column1, column2, ... FROM table_name LIMIT number_of_rows OFFSET offset_value;number_of_rows&#xff1a;指定返回的記錄數量。offset_value&#xff1a;從第幾條記錄開始返回&#xff08;偏移量從 0 開始計數&#xff09;。示…

監管科技(RegTech)應用:技術驅動的合規革命

目錄 監管科技(RegTech)應用:技術驅動的合規革命 1. 監管科技革命:數字化合規新范式 2. 技術架構全景 2.1 現代RegTech架構 2.2 合規效率公式 3. 核心技術實現 3.1 智能合約自動化合規 3.2 AI驅動的風險監測引擎 4. 核心應用場景 4.1 KYC/AML全流程自動化 4.2 實時交易監控系…

解決SQL Server連接失敗:Connection refused: connect

今天創建數據庫&#xff0c;本地連接SQL Server報錯&#xff1a;“通過端口 1433 連接到主機 127.0.0.1 的 TCP/IP 連接失敗。錯誤&#xff1a;Connection refused: connect”報錯圖如下&#xff1a;查了一圈&#xff0c;問題出在&#xff1a;TCP/IP 沒啟用。如果問題和我一樣&…

Windows bypassUAC 提權技法詳解(一)

引言 用戶賬戶控制&#xff08;User Account Control, 簡稱 UAC&#xff09;是微軟自 Windows Vista 起引入的一項安全功能&#xff0c;旨在通過要求用戶在執行需要管理員權限的操作時進行確認&#xff0c;從而防止未經授權的系統更改。UAC 的設計初衷是提高系統安全性&#xf…

OpenCV ------圖像基礎處理(一)

在 OpenCV 的圖像處理世界中&#xff0c;除了圖像邊框處理&#xff0c;還有一些基礎且重要的函數和運算&#xff0c;它們在圖像編輯、融合等場景中發揮著關鍵作用。下面我們就來詳細介紹cv2.copyMakeBorder()函數的具體參數與作用&#xff0c;以及圖像加法運算和加權運算的相關…

Unity寶箱隨機事件實現指南

目錄 前言 一、簡單的使用 新增ChestInteractableEvents&#xff0c;定義寶箱交互事件 新增Box 箱子掛載腳本&#xff0c;配置事件 運行效果 二、完善各種事件 1. 完善生成金幣事件 效果&#xff0c;金幣飛出 2. 完善生成敵人事件敵人 效果 3. 完善生成藥水事件 效…

從單機到分布式:用飛算JavaAI構建可擴展的TCP多人聊天系統

1. 引言&#xff1a;飛算JavaAI與實時通信技術的融合 1.1 為什么需要TCP多人聊天室&#xff1f; 在即時通訊領域&#xff0c;基于TCP協議的聊天室是理解網絡編程核心概念的經典案例&#xff0c;其技術價值體現在&#xff1a; 底層協議控制&#xff1a;直接操作Socket實現可靠數…

用 mock 把 ES 單元測試@elastic/elasticsearch-mock 上手

一、為什么“單元測 ES”這么別扭&#xff1f; 測試 ES 代碼時&#xff0c;最直覺的做法是連真集群做集成測試&#xff08;Docker 起個 ES&#xff09;&#xff0c;但&#xff1a; 啟動 & 數據裝填慢&#xff0c;不利于并行&#xff1b;網絡/磁盤抖動影響穩定性&#xff1b…

《嵌入式Linux應用編程(三):Linux文件IO系統調用深度解析》

今日學習內容1. 文件IO與標準IO核心對比特性標準IO文件IO實現層C標準庫Linux內核系統調用緩沖機制全緩沖/行緩沖無緩沖&#xff08;實時讀寫&#xff09;操作對象FILE*流指針整型文件描述符&#xff08;fd&#xff09;移植性跨平臺兼容Linux特有典型應用場景普通文件操作硬件設…

數據結構之順序表相關算法題

目錄一、移除元素二、刪除有序數組中的重復項三、合并兩個有序數組總結一、移除元素 移除元素 - 力扣 思路一&#xff1a;就是創建一個臨時數組&#xff0c;對原數組進行遍歷&#xff0c;找出與val不同的數據放到新數組里&#xff0c;然后再將tmp中的數據導回原數組 這個思…

百勝軟件×華為云聯合賦能,“超級國民品牌”海瀾之家新零售加速前行

報道顯示&#xff0c;早在2012年海瀾之家就開始布局數字化征程&#xff0c;并于近年對公司全流程信息化進行綜合重構升級優化&#xff0c;在采銷協同、業財一體等方面突破原有架構&#xff0c;通過信息化架構的增強為業務發展提供支撐。作為新零售重要組成部分的海瀾電商信息化…