C++中的map和set的使用

C++中的map詳解

  • 關聯式容器
  • 鍵值對
  • 樹形結構的關聯式容器
  • set的使用
    • 1. set的模板參數列表
    • 2. set的構造
    • 3. set的迭代器
    • 4. set的容量
    • 5. set修改操作
    • 6. set的使用舉例
  • map
    • 1. map的簡介
    • 2. map的模板參數說明
    • 3. map的構造
    • 4. map的迭代器
    • 5. map的容量與元素訪問
    • 6. map的元素修改
  • multimap和multiset的使用

關聯式容器

我們已經知道STL中的部分容器,比如:vector、list、deque、
list
等,這些容器統稱為序列式容器因為其底層為線性序列的數據結構,里面存儲的是元素本身。那什么是關聯式容器?它與序列式容器有什么區別?
關聯式容器也是用來存儲數據的,與序列式容器不同的是,其里面存儲的是<key, value>結構的鍵值對,在數據檢索時比序列式容器效率更高。

鍵值對

用來表示具有一一對應關系的一種結構,該結構中一般只包含兩個成員變量key和value,key代表鍵值,value表示與key對應的信息。比如:現在要建立一個英漢互譯的字典,那該字典中必然有英文單詞與其對應的中文含義,而且,英文單詞與其中文含義是一一對應的關系,即通過該應該單詞,在詞典中就可以找到與其對應的中文含義。

SGI-STL中關于鍵值對(pair)的定義:

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

樹形結構的關聯式容器

根據應用場景的不同,STL總共實現了兩種不同結構的管理式容器:樹型結構與哈希結構。樹型結構的關聯式容器主要有四種:map、set、multimap、multiset。這四種容器的共同點是:使用平衡搜索樹(即紅黑樹)作為其底層結果,容器中的元素是一個有序的序列

set的使用

1. set的模板參數列表

在這里插入圖片描述

2. set的構造

在這里插入圖片描述

3. set的迭代器

在這里插入圖片描述

4. set的容量

在這里插入圖片描述

5. set修改操作

在這里插入圖片描述

6. set的使用舉例

#include <set>
void TestSet()
{// 用數組array中的元素構造setint array[] = { 1, 3, 5, 7, 9, 2, 4, 6, 8, 0, 1, 3, 5, 7, 9, 2, 4, 6, 8, 0 };set<int> s(array, array+sizeof(array)/sizeof(array));cout << s.size() << endl;// 正向打印set中的元素,從打印結果中可以看出:set可去重for (auto& e : s)cout << e << " ";cout << endl;// 使用迭代器逆向打印set中的元素for (auto it = s.rbegin(); it != s.rend(); ++it)cout << *it << " ";cout << endl;// set中值為3的元素出現了幾次cout << s.count(3) << endl;
}

map

1. map的簡介

mapd的介紹文檔
閱讀map容器中的函數時三個重要的typedef的變量:
在這里插入圖片描述

翻譯:

  1. map是關聯容器,它按照特定的次序(按照key來比較)存儲由鍵值key和值value組合而成的元素。
  2. 在map中,鍵值key通常用于排序和惟一地標識元素,而值value中存儲與此鍵值key關聯的內容。鍵值key和值value的類型可能不同,并且在map的內部,key與value通過成員類型value_type綁定在一起,為其取別名稱為pair::typedef pair<const key, T> value_type;
  3. 在內部,map中的元素總是按照鍵值key進行比較排序的
  4. map中通過鍵值訪問單個元素的速度通常比unordered_map容器慢,但map允許根據順序對元素進行直接迭代(即對map中的元素進行迭代時,可以得到一個有序的序列)。
  5. map支持下標訪問符,即在[]中放入key,就可以找到與key對應的value。
  6. map通常被實現為二叉搜索樹(更準確的說:平衡二叉搜索樹(紅黑樹))

2. map的模板參數說明

在這里插入圖片描述

3. map的構造

在這里插入圖片描述

4. map的迭代器

在這里插入圖片描述

5. map的容量與元素訪問

在這里插入圖片描述
問題:當key不在map中時,通過operator獲取對應value時會發生什么問題?
在這里插入圖片描述
注意:在元素訪問時,有一個與operator[]類似的操作at()(該函數不常用)函數,都是通過key找到與key對應的value然后返回其引用,不同的是:當key不存在時,operator[]用默認value與key構造鍵值對然后插入,返回該默認value,at()函數直接拋異常。

6. map的元素修改

在這里插入圖片描述


在這里插入圖片描述

在這里插入圖片描述


在這里插入圖片描述
在這里插入圖片描述
返回值:
在這里插入圖片描述

#include <iostream>
using namespace std;
#include <string>
#include <map>
void TestMap()
{map<string, string> m;// 向map中插入元素的方式:// 將鍵值對<"peach","桃子">插入map中,用pair直接來構造鍵值對m.insert(pair<string, string>("peach", "桃子"));// 將鍵值對<"peach","桃子">插入map中,用make_pair函數來構造鍵值對m.insert(make_pair("banan", "香蕉"));// 借用operator[]向map中插入元素/*operator[]的原理是:用<key, T()>構造一個鍵值對,然后調用insert()函數將該鍵值對插入到map中如果key已經存在,插入失敗,insert函數返回該key所在位置的迭代器如果key不存在,插入成功,insert函數返回新插入元素所在位置的迭代器operator[]函數最后將insert返回值鍵值對中的value返回*/// 將<"apple", "">插入map中,插入成功,返回value的引用,將“蘋果”賦值給該引// 用結果,m["apple"] = "蘋果";// key不存在時拋異常//m.at("waterme") = "水蜜桃";cout << m.size() << endl;// 用迭代器去遍歷map中的元素,可以得到一個按照key排序的序列for (auto& e : m)cout << e.first << "--->" << e.second << endl;cout << endl;// map中的鍵值對key一定是唯一的,如果key存在將插入失敗auto ret = m.insert(make_pair("peach", "桃色"));if (ret.second)cout << "<peach, 桃色>不在map中, 已經插入" << endl;elsecout << "鍵值為peach的元素已經存在:" << ret.first->first << "--->"<< ret.first->second << " 插入失敗" << endl;// 刪除key為"apple"的元素m.erase("apple");if (1 == m.count("apple"))cout << "apple還在" << endl;elsecout << "apple被吃了" << endl;
}

【map總結】

  1. map中的的元素是鍵值對
  2. map中的key是唯一的,并且不能修改
  3. 默認按照小于的方式對key進行比較
  4. map中的元素如果用迭代器去遍歷,可以得到一個有序的序列
  5. map的底層為平衡搜索樹(紅黑樹),查找效率比較高 O ( l o g 2 N ) O(log_2 N) O(log2?N)
  6. 支持[]操作符,operator[]中實際進行插入查找。

multimap和multiset的使用

multimap和multiset的使用

(本章完)

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

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

相關文章

Linux vim操作教程(vim 基操、vim替換和查找、 vim改變文本顏色、判斷和循環語句)

vim 基操 vim 是一個強大的文本編輯器,常用于在終端環境下編輯文件。下面是一些常用的 vim 操作: 打開文件:在終端中輸入 vim 文件名 來打開一個文件,如果文件不存在,則會創建一個新文件。 模式切換: 按下 i 進入插入模式,在該模式下可以輸入和編輯文本。按下 Esc 鍵返…

python單例模式

單例模式是一種創建型設計模式&#xff0c;它保證一個類僅有一個實例&#xff0c;并提供一個全局訪問點。 在 Python 中&#xff0c;可以使用以下幾種方式來創建單例模式&#xff1a; 使用 __new__ 方法 在 Python 中&#xff0c; __new__ 方法是一個類方法&#xff0c;它在…

msvcp120.dll丟失是什么意思,哪個修復方法最簡單

在計算機使用過程中&#xff0c;我們經常會遇到一些錯誤提示&#xff0c;其中之一就是“找不到msvcp120.dll”。這個錯誤通常發生在運行某些程序或游戲時&#xff0c;它會導致程序無法正常啟動或運行。那么&#xff0c;這個錯誤提示到底是什么意思呢&#xff1f;為了解決這個問…

深入了解Java8新特性-日期時間API_LocalDate類

閱讀建議 嗨&#xff0c;伙計&#xff01;刷到這篇文章咱們就是有緣人&#xff0c;在閱讀這篇文章前我有一些建議&#xff1a; 本篇文章大概12000多字&#xff0c;預計閱讀時間長需要10分鐘。本篇文章的實戰性、理論性較強&#xff0c;是一篇質量分數較高的技術干貨文章&…

【iOS】數據持久化(一)之Plist文件、Preference(NSUserDefaults類)

目錄 什么是Plist文件&#xff1f;plist可以存儲哪些數據類型plist文件數據的讀取與存儲 Perference&#xff08;NSUserDefaults&#xff09;使用方法registerDefaults: 方法的使用 什么是Plist文件&#xff1f; Plist文件&#xff08;屬性列表&#xff09;是將某些特定的類&a…

python運行hhblits二進制命令的包裝器類

hhblits 是 HMM-HMM&#xff08;Hidden Markov Model to Hidden Markov Model&#xff09;比對方法的一部分&#xff0c;也是 HMMER 軟件套件中的工具之一。與 hhsearch 類似&#xff0c;hhblits 也用于進行高效的蛋白質序列比對&#xff0c;特別擅長于檢測遠緣同源性。 hh-su…

筑牢思想防線——建行駐江門市分行紀檢組舉辦2023年清廉合規大講堂

為推動廉潔教育打通“最后一公里”&#xff0c;近日&#xff0c;建行駐江門市分行紀檢組舉辦江門市分行2023年清廉合規大講堂。 本次大講堂檢察官結合一線辦案經歷&#xff0c;從防范化解金融風險、預防金融從業人員犯罪等方面對全轄員工進行了深入淺出地的講解&#xff0c;引導…

代碼隨想錄算法訓練營第五十二天|1143.最長公共子序列 1035.不相交的線 53. 最大子序和

文檔講解&#xff1a;代碼隨想錄 視頻講解&#xff1a;代碼隨想錄B站賬號 狀態&#xff1a;看了視頻題解和文章解析后做出來了 1143.最長公共子序列 class Solution:def longestCommonSubsequence(self, text1: str, text2: str) -> int:dp [[0] * (len(text2) 1) for _ i…

C++——stack和queue

目錄 stack的介紹和使用 stack的使用 queue的介紹和使用 queue的使用 容器適配器 deque的介紹 deque的缺陷 priority_queue的介紹和使用 priority_queue的使用 仿函數 反向迭代器 stack的介紹和使用 在原來的數據結構中已經介紹過什么是棧了&#xff0c;再來回顧一下…

視頻監控平臺EasyCVR+智能分析網關+物聯網,聯合打造智能環衛監控系統

一、背景介紹 城市作為人們生活的載體&#xff0c;有著有無數樓宇和四通八達的街道&#xff0c;這些建筑的整潔與衛生的背后&#xff0c;是無數環衛工作人員的努力。環衛工人通過清理垃圾、打掃街道、清洗公共設施等工作&#xff0c;保持城市的整潔和衛生&#xff0c;防止垃圾…

【機器學習 | 白噪聲檢驗】檢驗模型學習成果 檢驗平穩性最佳實踐,確定不來看看?

&#x1f935;?♂? 個人主頁: AI_magician &#x1f4e1;主頁地址&#xff1a; 作者簡介&#xff1a;CSDN內容合伙人&#xff0c;全棧領域優質創作者。 &#x1f468;?&#x1f4bb;景愿&#xff1a;旨在于能和更多的熱愛計算機的伙伴一起成長&#xff01;&#xff01;&…

C++ Day09 容器

C-STL01- 容器 引入 我們想存儲多個學員的信息 , 現在學員數量不定 通過以前學習的知識 , 我們可以創建一個數組存儲學員的信息 但是這個數組大小是多少呢 ? 過大會導致空間浪費 , 小了又需要擴容 對其中的數據進行操作也較為復雜 每次刪除數據后還要對其進行回收等操作…

cookie的跨站策略 跨站和跨域

借鑒&#xff1a;Cookie Samesite簡析 - 知乎 (zhihu.com) 1、跨站指 協議、域名、端口號都必須一致 2、跨站 頂級域名二級域名 相同就行。cookie遵循的是跨站策略

PowerDesigner異構數據庫轉換

主要流程:sql->pdm->cdm->other pdm->sql 1.根據sql生成pdm 2.根據pdm生成cdm 3.生成其他類型數據庫pdm

【Java】認識String類

文章目錄 一、String類的重要性二、String類中的常用方法1.字符串構造2.String對象的比較3.字符串查找4.轉換5.字符串替換6.字符串拆分7.字符串截取8.其他操作方法9.字符串的不可變性10.字符串修改 三、StringBuilder和StringBuffer 一、String類的重要性 在C語言中已經涉及到…

C語言第二十五彈--打印菱形

C語言打印菱形 思路&#xff1a;想要打印一個菱形&#xff0c;可以分為上下兩部分&#xff0c;通過觀察可以發現上半部分星號的規律是 1 3 5 7故理解為 2對應行數 1 &#xff0c;空格是4 3 2 1故理解為 行數-對應行數-1。 上半部分代碼如下 for (int i 0;i < line;i){//上…

Vivado Modelsim聯合進行UVM仿真指南

打開Vivado&#xff0c;打開對應工程&#xff0c;點擊左側Flow Navigator-->PROJECT MANAGER-->Settings&#xff0c;打開設置面板。點擊Project Settings-->Simulation選項卡&#xff0c;如下圖所示。 將Target simulator設為Modelsim Simulator。 在下方的Compil…

OpenGL 繪制圓形平面(Qt)

文章目錄 一、簡介二、代碼實現三、實現效果一、簡介 這里使用一種簡單的思路來生成一個圓形平面: 首先,我們需要生成一個單位圓,半徑為1,法向量為(0, 0, 1),這一步我們可以使用一些函數生成圓形點集。之后,指定面片的索引生成一個圓形平面。當然這里為了后續管理起來方便…

Py之PyMuPDF:PyMuPDF的簡介、安裝、使用方法之詳細攻略

Py之PyMuPDF&#xff1a;PyMuPDF的簡介、安裝、使用方法之詳細攻略 目錄 PyMuPDF的簡介 PyMuPDF的安裝 PyMuPDF的使用方法 1、基礎用法 PyMuPDF的簡介 PyMuPDF是一個高性能的Python庫&#xff0c;用于PDF(和其他)文檔的數據提取&#xff0c;分析&#xff0c;轉換和操作。 …

Matrix

Matrix 如下是四種變換對應的控制參數&#xff1a; Rect 常用的一個“繪畫相關的工具類”&#xff0c;常用來描述長方形/正方形&#xff0c;他只有4個屬性&#xff1a; public int left; public int top; public int right; public int bottom; 這4個屬性描述著這一個“方塊…