C++map容器關聯式容器

C++map

1. 關聯式容器

vector、list、deque、forward_list(C++11)等STL容器,其底層為線性序列的數據結構,里面存儲的是元素本身,這樣的容器被統稱為序列式容器。而map、set是一種關聯式容器,關聯式容器也是用來存儲數據的,與序列式容器不同的是,關聯式容器里面存儲的是<key, value>結構的鍵值對,在數據檢索時比序列式容器效率更高。map和set的鍵是唯一的,但是mutimap和multiset支持多個同名且有不同映射的鍵共存。

2. 鍵值對

用來表示具有一一對應關系的一種結構,該結構中一般只包含兩個成員變量key和value, key代表鍵值,value表示與key對應的信息。比如:學生的姓名和他的學號是一一對應的,那么就可以通過查找學生的姓名來查找到對應的學號。map容器是Key Value結構,允許修改value,且允許多個相同的value存在。但map不允許存在相同的key(multimap除外),且key不可修改(因為會破壞內部的紅黑樹結構)。

3. map容器

在這里插入圖片描述

形參含義:

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

4. map的成員變量

map中鍵是不允許被修改的(因為修改鍵會破壞搜索二叉樹的結構),但是映射可以被修改。map在value_type中使用了pair來保護鍵。map實例化的格式,實際上是調用了pair模板的顯式實例化。

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

5. map的成員函數

5.1 map的成員函數介紹

map的構造:

函數聲明功能介紹
map<K,V>m()構造一個空的map

map的迭代器:

函數聲明功能介紹
begin()end()begin:首元素的位置;end:下一個元素的位置
cbegin()cend()c指const,cbegin和cend指向的內容不能修改
rbegin()rend()反向迭代器,rbegin從end開始,rend從begin開始,其++和–的方向相反
crbegin()crend()與前一個功能相同,但指向的內容不能修改

map的容量與元素訪問:

函數名函數聲明功能介紹
emptybool empty() const檢測map中的元素是否為空,為空返回ture,不為空返回false
sizesize_type size() const返回map中有效元素的個數
operator[]mapped type& operator[] (const key_type& k返回key對應的value
atmapped_type& at (const key_type& k);const mapped_type& at (const key_type& k) const;返回key對應的value

注意:

在元素訪問時,at()(該函數不常用)函數,于operator[]功能相同但有一點區別:當key不存在時,operator[]用默認value與key構造鍵值對然后插入,返回該默認value, at()函數直接拋異常。

map的修改:

函數名函數聲明功能介紹
insertpair<iterator,bool> insert (const value_type& val)在map中插入鍵值對x,注意x是一個鍵值對,返回值也是鍵值對;iterator代表新插入元素的位置,bool代表插入成功
erasevoid erase (iterator position)刪除position位置上的元素
size_type erase (const key_type& k)刪除鍵值為x的元素
void erase (iterator first, iterator last)刪除**[first,last)**區間中的元素
swapvoid swap (map& x)交換兩個map中的元素
clearvoid clear()刪除map里所有的元素

map的比較:

函數名函數聲明功能介紹
key_comp
value_comp

map的操作:

函數名函數聲明功能介紹
finditerator find (const key_type& k)搜索map里鍵等于k的元素,如果找到返回一個映射的迭代器,找不到返回end的迭代器
countsize_type count (const key_type& k) const搜索map里鍵等于k的元素,找到返回1,找不到返回0
lower_bounditerator lower_bound (const key_type& k)在map里找>=k的元素,返回符合情況的最小鍵的迭代器
upper_bounditerator upper_bound (const key_type& k)在map里找>k的元素,返回符合情況的最小鍵的迭代器
equal_rangepair<iterator,iterator>equal_range (const key_type& k)

5.2 insert

insert的返回值是一個pair類模板,而它的參數val也有一個pair類模板。**insert使用pair類模板使得它同時具有插入和搜索的功能。**bool值用來判斷map中需要插入的值是否已經存在,iterator是指向val值的迭代器。

在這里插入圖片描述

insert的返回值:

如果insert搜索的val值存在,bool值就為false(判斷插入失敗),iterator會指向map中已經存在的val值;如果insert搜索的val值不存在,bool值就為true(判斷插入成功),iterator會指向新插入的val值。

使用insert進行搜索:

由于insert使用pair類模板,所以它也有搜索的功能:

#include<iostream>
#include<map>
#include<string.h>
using namespace std;int main()
{string arr[] = { "張三","李四","王五","張三","張三","李四","張三","李四","王五","張三" };map<string, int> countmap;for (auto& e : arr)//傳引用是為了拷貝臨時變量浪費資源{pair<map<string, int>::iterator, bool>ret = countmap.insert(make_pair(e, 1));if (ret.second == false){ret.first->second++;}}for (auto& i : countmap){cout << i.first << ":" << i.second << endl;}return 0;
}

在這里插入圖片描述

5.3 operator[]

map的operator[]是借助inert來實現的:

在這里插入圖片描述

因此map的operator[]同時具有插入、查找和修改的功能:

#include<iostream>
#include<map>
#include<string.h>
using namespace std;int main()
{map<string, string> m;m.insert(make_pair("first", "first"));m.insert(make_pair("second", "second"));cout << "before:" << endl;for (auto& i : m){cout << i.first << " : " << i.second << endl;}m["third"];//插入printf("\n");cout << m["first"] << endl;//查找m["first"] = "x";//修改m["fourth"] = "xxxx";//插入+修改printf("\n");cout << "after:" << endl;for (auto& i : m){cout << i.first << " : " << i.second << endl;}return 0;
}

6. map的特點

stl里的map和set用的是同一顆紅黑樹來實現的。

set:

在這里插入圖片描述

注意:Rb_tree里有一個key_type和一個value_type,但set應該是key和key的映射關系,所以在成員變量里,stl把key_type和value_type都定義了為_key

map:

在這里插入圖片描述

而在stl的map里,value_type則定義了一個pair,這樣做的目的就是為了復用同一顆紅黑樹

所以從set和map的底層來看,它們的實現方法分別是:

set<K.>->rb_tree<K, K>

map<K, V>->rb_tree<K ,pair<const K, V>>

這種寫法實際上是由stl_tree.h文件中的val模板決定你是key的set,還是key/value的map:

在這里插入圖片描述

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

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

相關文章

日期問題,

日期問題 ac代碼 #include <cstdio> #include <iostream>using namespace std;int days[13] {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};bool check_valid(int year, int month, int day) {if (month 0 || month > 12) return false;if (day 0) …

【開發】模型部署筆記

目錄 模型量化 模型量化 1、模型量化優點 低精度模型表示模型權重數值格式為FP16&#xff08;半精度浮點&#xff09;或者INT8&#xff08;8位定點整數&#xff09;&#xff0c;但是目前低精度往往就指代INT8。常規精度模型則一般表示模型權重數值格式為FP32&#xff08;32位…

求數組最大值

#include <bits/stdc.h> using namespace std; int main(){int a[4]{1,2,3,4};cout<<*max_element(a,a4);return 0; }

策略模式詳解

策略模式 1 概述 先看下面的圖片&#xff0c;我們去旅游選擇出行模式有很多種&#xff0c;可以騎自行車、可以坐汽車、可以坐火車、可以坐飛機。 作為一個程序猿&#xff0c;開發需要選擇一款開發工具&#xff0c;當然可以進行代碼開發的工具有很多&#xff0c;可以選擇Idea進…

JavaScript的跳轉傳參方式

在JavaScript中&#xff0c;頁面跳轉并傳遞參數通常可以通過幾種不同的方式來實現。下面是一些常見的方法&#xff1a; 1.URL參數&#xff08;Query String&#xff09; 這是最常見的方式&#xff0c;通過在URL的末尾添加參數來實現。例如&#xff1a; javascriptwindow.loc…

gitlab webhook觸發jenkins任務

配置jenkins 安裝gitlab插件 配置jenkins job 選擇gitlab webhook觸發 在高級中生成token 代碼倉設置 新增webhook 配置webhook 測試連接 缺點&#xff0c;不能帶gitLab事件的參數&#xff01;&#xff01;&#xff01;

Spark RDD案例:統計網站每月訪問量

這個項目利用Spark技術&#xff0c;通過統計網站訪問記錄中的日期信息&#xff0c;實現了對每月訪問量的統計和排序。通過分析數據&#xff0c;我們可以了解到不同月份的網站訪問情況&#xff0c;為進一步優化網站內容和推廣策略提供數據支持。 使用Spark統計網站每月訪問量 …

Apache2.4和PHP8的量子糾纏

Apache不建議你用&#xff0c;PHP建議使用

一種基于電場連續性的高壓MOSFET緊湊模型,用于精確表征電容特性

來源&#xff1a;A Compact Model of High-Voltage MOSFET Based on Electric Field Continuity for Accurate Characterization of Capacitance&#xff08;TED 24年&#xff09; 摘要 本文提出了一種新的高壓MOSFET&#xff08;HV MOS&#xff09;緊湊模型&#xff0c;以消…

P5732 楊輝三角

題目描述 給出 &#x1d45b;(&#x1d45b;≤20)n(n≤20)&#xff0c;輸出楊輝三角的前 &#x1d45b;n 行。 如果你不知道什么是楊輝三角&#xff0c;可以觀察樣例找找規律。 輸入格式 無 輸出格式 無 輸入輸出樣例 輸入 #1復制 6 輸出 #1復制 1 1 1 1 2 1 1 3 3 …

408學習筆記-數據結構-2-線性表

線性表 1、邏輯結構 1、數據結構只有一種邏輯結構&#xff0c;而可以有兩種存儲結構&#xff0c;有多種抽象運算。 2、線性表是一種邏輯結構&#xff0c;屬于總線性結構——線性結構的一種&#xff0c;同屬于線性結構的邏輯結構還有&#xff1a;棧、隊列和數組。 3、線性表定…

【經典文獻】水下光學和聲學成像:融合的時代?最新技術概述

文獻名稱&#xff1a;《Underwater Optical and Acoustic Imaging: A Time for Fusion? A Brief Overview of the State-of-the-Art》作者列表&#xff1a;Fausto Ferreira, Diogo Machado, Gabriele Ferri, Samantha Dugelay and John Potter作者單位&#xff1a;北約科學技術…

【hana】hana1.0多容器常用命令

基礎命令 數據庫 連接數據庫 hdbsql -u system -p {passwd} -i 02 -d {dbname}查詢所有數據庫 SELECT DATABASE_NAME, ACTIVE_STATUS FROM M_DATABASES;停止數據庫&#xff0c;會修改數據庫狀態為No ALTER SYSTEM STOP DATABASE testdb; 啟動數據庫&#xff0c;會修改數據…

多線程的代碼案例

目錄 單例模式 餓漢模式 懶漢模式 阻塞隊列 生產者消費者模型意義: 阻塞隊列使用方法 實現阻塞隊列 阻塞隊列實現生產者消費者模型 定時器 實現簡單的定時器 工廠模式 線程池 為啥呢? 從池子里面取 比 創建線程 效率更高 線程池的創建 怎么填坑 ThreadPoolExec…

多年后,再探算法和數據結構

多年來&#xff0c;通過深入學習和實踐各種編程語言&#xff0c;我對數據結構和算法在程序設計中的中心地位有了新的認識。本次從匯編語言到高級編程語言的探討&#xff0c;展示了無論技術如何進步&#xff0c;構成程序的核心—算法和數據結構—始終保持其基礎和不變的角色。 …

圖解堆排序【一眼看穿邏輯思路】

P. S.&#xff1a;以下代碼均在VS2019環境下測試&#xff0c;不代表所有編譯器均可通過。 P. S.&#xff1a;測試代碼均未展示頭文件stdio.h的聲明&#xff0c;使用時請自行添加。 目錄 1、堆的概念2、實現堆排序前的準備工作3、堆排序的思路3.1 第一步3.2 第二步 4、結語 1、…

音視頻捕捉技術:LCC382 SDI采集卡深度解析

在日新月異的多媒體時代&#xff0c;高質量的音視頻采集已成為眾多領域不可或缺的一環。為此&#xff0c;靈卡科技精心打造了LCC382 —— 一款集高效性、靈活性與前沿技術于一身的SDI輸入與環出、HDMI輸出音視頻采集卡&#xff0c;旨在滿足從專業直播、視頻會議到醫療影像、安防…

網頁版Figma漢化

最近學習Figma&#xff0c;簡單介紹一下網頁版Figma的漢化方法 1.打開網址&#xff1a;Figma軟件漢化-Figma中文版下載-Figma中文社區 2.下載漢化插件離線包 解壓漢化包 3.點開谷歌的管理擴展程序 4.點擊加載已解壓的擴展程序&#xff0c;選擇剛剛解壓的包 這樣就安裝好了漢化…

QT狀態機2-含終止狀態的嵌套狀態機

#include "MainWindow.h" #include "ui_MainWindow.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent)