unordered_map和unordered的介紹和使用

目錄

unordered系列關聯式容器

unordered_map

unordered_map的接口說明

unordered_map的定義方式

unordered_map接口的使用

unordered_map的容量

unordered_map的迭代器

unordered_map的元素訪問

unordered_map的查詢

unordered_map的修改操作

unordered_multimap

unordered_set

unordered_set的定義方式

unordered_set的接口使用

unordered_multiset


unordered系列關聯式容器

在C++98中,STL提供了底層為紅黑樹結構的一系列關聯式容器,在查詢時效率可達到logN,即最差情況下需要比較紅黑樹的高度次,當樹中的節點非常多時,查詢效率也不理想。最好的查詢是,進行很少的比較次數就能夠將元素找到,因此在C++11中,STL又提供了4個 unordered系列的關聯式容器,這四個容器與紅黑樹結構的關聯式容器使用方式基本類似,只是其底層結構不同

unordered_map

1. unordered_map是存儲鍵值對的關聯式容器,其允許通過keys快速的索引到與 其對應的value。

2. 在unordered_map中,鍵值通常用于惟一地標識元素,而映射值是一個對象,其內容與此 鍵關聯。鍵和映射值的類型可能不同。

3. 在內部,unordered_map沒有對按照任何特定的順序排序, 為了能在常數范圍內 找到key所對應的value,unordered_map將相同哈希值的鍵值對放在相同的桶中。

4. unordered_map容器通過key訪問單個元素要比map快,但它通常在遍歷元素子集的范圍迭 代方面效率較低。

5. unordered_maps實現了直接訪問操作符(operator[]),它允許使用key作為參數直接訪問 value。

6. 它的迭代器至少是前向迭代器。

unordered_map的接口說明

unordered_map的構造

unordered_map的定義方式

方式一: 指定key和value的類型構造一個空容器。

unordered_map<int, double> um1; //構造一個key為int類型,value為double類型的空容器

方式二: 拷貝構造某同類型容器的復制品。

unordered_map<int, double> um2(um1); //拷貝構造同類型容器um1的復制品

方式三: 使用迭代器拷貝構造某一段內容。

//使用迭代器區間構造
string str = "nxbw";
unordered_map<int, double> mp3(str.begin(), str.end());

unordered_map接口的使用

unordered_map的容量

bool empty() const? 檢測unordered_map是否為空

unordered_map<int, string> mp1;
mp1.emplace(1, "111");
cout << mp1.empty() << endl; // 0unordered_map<int, string> mp2;
cout << mp2.empty() << endl; // 1 

size_t size() const? 獲取unordered_map的有效元素個數

unordered_map<int, string> mp1;
mp1.emplace(1, "111");
mp1.emplace(2, "111");
mp1.emplace(3, "111");cout << mp1.size() << endl; // 3

unordered_map的迭代器

begin 返回unordered_map第一個元素的迭代器

unordered_map<int, string> mp1;unordered_map<int, string>::iterator it = mp1.begin();mp1.emplace(1, "111");
mp1.emplace(2, "111");
mp1.emplace(3, "111");cout << it->first << ' ' << it->second << endl; // 1 111

end 返回unordered_map最后一個元素下一個位置的迭代器

unordered_map<int, string> mp1;
mp1.emplace(1, "111");
mp1.emplace(2, "111");
mp1.emplace(3, "222");unordered_map<int, string>::iterator it = mp1.end();
--it;
cout << it->first << ' ' << it->second << endl;

cbegin 返回unordered_map第一個元素的const迭代器

cend 返回unordered_map最后一個元素下一個位置的const迭代器

unordered_map的元素訪問

operator[] 返回與key對應的value,沒有一個默認值

注意:該函數中實際調用哈希桶的插入操作,用參數key與V()構造一個默認值往底層哈希桶 中插入,如果key不在哈希桶中,插入成功,返回V(),插入失敗,說明key已經在哈希桶中, 將key對應的value返回。

unordered_map<int, string> mp1;
mp1.emplace(1, "111");
mp1.emplace(2, "111");
mp1.emplace(3, "222");cout << mp1[1] << endl; // 111
mp1[1] = "333";
cout << mp1[1] << endl; // 333mp1[4] = "888";
cout << mp1[4] << endl; //插入4,并返回888

unordered_map的查詢

iterator ?nd(const K& key) 返回key在哈希桶中的位置

unordered_map<int, string> mp1;
mp1.emplace(1, "111");
mp1.emplace(2, "222");
mp1.emplace(3, "333");//找到返回該位置的迭代器,否則返回end()迭代器
unordered_map<int, string>::iterator it = mp1.find(1);
cout << it->first << it->second << endl;if (mp1.find(4) == mp1.end()) cout << "find fail!" << endl;

size_t count(const K& key) 返回哈希桶中關鍵碼為key的鍵值對的個數

unordered_map<int, string> mp1;
mp1.emplace(1, "111");
mp1.emplace(2, "222");
mp1.emplace(3, "333");
mp1.emplace(4, "333");
mp1.emplace(5, "333");cout << mp1.count(2) << endl; //找到返回1,否則返回0

unordered_map的修改操作

insert 向容器中插入鍵值對

unordered_map<int, string> mp1;
mp1.insert(make_pair(1, "111"));
mp1.insert(make_pair(2, "111"));
mp1.insert(make_pair(3, "111"));for (const auto& e : mp1)
{cout << e.first << ' ' << e.second << endl;
}

erase 刪除容器中的鍵值對

mp1.erase(1);
mp1.erase(2);for (const auto& e : mp1)
{cout << e.first << ' ' << e.second << endl;
}

void clear() 清空容器中有效元素個數

unordered_map<int, string> mp1;
mp1.insert(make_pair(1, "111"));
mp1.insert(make_pair(2, "111"));
mp1.insert(make_pair(3, "111"));mp1.clear();
cout << mp1.empty() << endl; // 1

void swap(unordered_map&) 交換兩個容器中的元素

unordered_map<int, string> mp1;
mp1.insert(make_pair(1, "111"));
mp1.insert(make_pair(2, "222"));
mp1.insert(make_pair(3, "333"));unordered_map<int, string> mp2;
mp2.insert(make_pair(4, "444"));
mp2.insert(make_pair(5, "555"));
mp2.insert(make_pair(6, "666"));mp1.swap(mp2);cout << "mp1: " << endl;
for (const auto& e : mp1)
{cout << e.first << ' ' << e.second << endl;
}cout << "mp2: " << endl;
for (const auto& e : mp2)
{cout << e.first << ' ' << e.second << endl;
}

unordered_multimap

unordered_multimap容器與unordered_map容器的底層數據結構是一樣的,都是哈希表,其次,它們所提供的成員函數的接口都是基本一致的,這里就不再列舉了,這兩種容器唯一的區別就是,unordered_multimap容器允許鍵值冗余,即unordered_multimap容器當中存儲的鍵值對的key值是可以重復的。

unordered_multimap<int, string> mp;
mp.emplace(1, "111");
mp.emplace(2, "111");
mp.emplace(3, "111");
mp.emplace(2, "111");
mp.emplace(3, "111");for (const auto& e : mp)
{cout << e.first << ' ' << e.second << ' ';
}

由于unordered_multimap容器允許鍵值對的鍵值冗余,因此該容器中成員函數find和count的意義與unordered_map容器中的也有所不同:

成員函數find功能
unordered_map容器返回鍵值為key的鍵值對的迭代器
unordered_multimap容器返回底層哈希表中第一個找到的鍵值為key的鍵值對的迭代器
成員函數count功能
unordered_map容器鍵值為key的鍵值對存在則返回1,不存在則返回0(find成員函數可替代)
unordered_multimap容器返回鍵值為key的鍵值對的個數(find成員函數不可替代)

其次,由于unordered_multimap容器允許鍵值對的鍵值冗余,調用[ ]運算符重載函數時,應該返回鍵值為key的哪一個鍵值對的value的引用存在歧義,因此在unordered_multimap容器當中沒有實現[ ]運算符重載函數。

unordered_set

在C++98中,STL提供了底層為紅黑樹結構的一系列關聯式容器,在查詢時的效率可達到O ( l o g N ) O(logN)O(logN),即最差情況下需要比較紅黑樹的高度次,當樹中的結點非常多時,查詢效率也不理想。最好的查詢是,進行很少的比較次數就能夠將元素找到,因此在C++11中,STL又提供了4個unordered系列的關聯式容器,這四個容器與紅黑樹結構的關聯式容器使用方式基本類似,只是其底層結構不同。

unordered_set的定義方式

方式一: 構造一個某類型的空容器。

unordered_set<int> us1; //構造int類型的空容器

方式二: 拷貝構造某同類型容器的復制品。

unordered_set<int> us2(us1); //拷貝構造同類型容器us1的復制品

方式三: 使用迭代器拷貝構造某一段內容。

string str("abcedf");
unordered_set<char> us3(str.begin(), str.end()); //構造string對象某段區間的復制品

unordered_set的接口使用

unordered_set當中常用的成員函數如下:

成員函數功能
insert插入指定元素
erase刪除指定元素
find查找指定元素
size獲取容器中元素的個數
empty判斷容器是否為空
clear清空容器
swap交換兩個容器中的數據
count獲取容器中指定元素值的元素個數

unordered_set當中迭代器相關函數如下:

成員函數功能
begin獲取容器中第一個元素的正向迭代器
end獲取容器中最后一個元素下一個位置的正向迭代器

使用示例:

int main()
{unordered_set<int> st;st.insert(1);st.insert(4);st.insert(4);st.insert(2);st.insert(3);st.insert(2);//去重 遍歷容器元素方式一for (const auto& e : st){cout << e << ' '; // 1 4 2 3}cout << endl;//刪除元素方式一 使用key值st.erase(1);//刪除元素方式二 使用迭代器unordered_set<int>::iterator it = st.find(1);if (it != st.end()){st.erase(it);}//遍歷容器元素方式二unordered_set<int>::iterator it = st.begin();while(it != st.end()){cout << *it << ' '; //1 4 3 2it++;}cout << endl;//容器中值為2的元素cout << st.count(2) << endl;//容器大小cout << st.size() << endl;//判斷容器是否為空,為空返回真,否則假cout << st.empty() << endl;//交換兩個容器的數據unordered_set<int> rst( {5, 4, 6, 7} );rst.swap(rst);for (const auto& e : rst){cout << e << ' ';}cout << endl;return 0;
}

unordered_multiset

unordered_multiset容器與unordered_set容器的底層數據結構是一樣的,都是哈希表,其次,它們所提供的成員函數的接口都是基本一致的,這里就不再列舉了,這兩種容器唯一的區別就是,unordered_multiset容器允許鍵值冗余,即unordered_multiset容器當中存儲的元素是可以重復的。

unordered_multiset<int> st;
st.insert(1);
st.insert(1);
st.insert(2);
st.insert(2);
st.insert(3);
st.insert(3);for (const auto& e : st)
{cout << e << ' '; // 1 1 2 2 3 3
}
cout << endl;

由于unordered_multimap容器允許鍵值對的鍵值冗余,因此該容器中成員函數find和count的意義與unordered_map容器中的也有所不同:

成員函數find功能
unordered_map容器返回鍵值為key的鍵值對的迭代器
unordered_multimap容器返回底層哈希表中第一個找到的鍵值為key的鍵值對的迭代器
成員函數count功能
unordered_map容器鍵值為key的鍵值對存在則返回1,不存在則返回0(find成員函數可替代)
unordered_multimap容器返回鍵值為key的鍵值對的個數(find成員函數不可替代)

其次,由于unordered_multimap容器允許鍵值對的鍵值冗余,調用[ ]運算符重載函數時,應該返回鍵值為key的哪一個鍵值對的value的引用存在歧義,因此在unordered_multimap容器當中沒有實現[ ]運算符重載函數。

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

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

相關文章

設計模式7大原則與UML類圖詳解

設計模式7大原則與UML類圖詳解 引言 &#x1f31f; 在軟件工程領域&#xff0c;設計模式和UML&#xff08;統一建模語言&#xff09;是提高代碼質量、增強系統可維護性的重要工具。設計模式提供了解決軟件設計中常見問題的通用方案&#xff0c;而UML則為我們提供了一種可視化的…

計算機視覺與深度學習 | Python實現ARIMA-LSTM時間序列預測(完整源碼和數據)

ARIMA-LSTM混合模型 1. 環境準備2. 數據生成(示例數據)3. 數據預處理4. ARIMA建模5. LSTM殘差建模6. 混合預測7. 結果可視化完整代碼說明1. **數據生成**2. **ARIMA建模**3. **LSTM殘差建模**4. **混合預測**5. **性能評估**參數調優建議擴展方向典型輸出以下是使用Python實現…

Docker部署單節點Elasticsearch

1.Docker部署單節點ES 1.前置條件 配置內核參數 echo "vm.max_map_count262144" >> /etc/sysctl.conf sysctl -w vm.max_map_count262144準備密碼 本文所有涉及密碼的配置&#xff0c;均使用通用密碼 Zzwl2024。 生產環境&#xff0c;請用密碼生成器生成20…

pe文件二進制解析(用c/c++解析一個二進制pe文件)

pe文件二進制解析 c解析pe文件控制臺版本 #include<iostream> #include<windows.h> #include<vector>/*RVA&#xff08;相對虛擬地址&#xff09;與FOA&#xff08;文件偏移地址&#xff09;的轉換1.得到 的值&#xff1a;內存地址 - ImageBase2.判斷是否位…

融智學視域下的系統性認知增強框架——基于文理工三類AI助理賦能HI四階躍遷路徑

融智學視域下的系統性認知增強框架 ——基于文理工三類AI助理賦能HI四階躍遷路徑 一、如何排除50個認知偏差&#xff1a;消除50類偏差的精準矯正系統 1. 技術架構 文科AI&#xff1a; 構建文化語義場&#xff08;Cultural Semantic Field, CSF&#xff09;&#xff0c;通過…

MMDetection環境安裝配置

MMDetection 支持在 Linux&#xff0c;Windows 和 macOS 上運行。它需要 Python 3.7 以上&#xff0c;CUDA 9.2 以上和 PyTorch 1.8 及其以上。 MMDetection 至今也一直更新很多個版本了&#xff0c;但是對于最新的pytorch版本仍然不支持&#xff0c;我安裝的時候仍然多次遇到m…

如何實現k8s高可用

一、控制平面高可用設計 多主節點部署 ? API Server 冗余&#xff1a;部署至少 3 個 Master 節點&#xff0c;每個節點運行獨立的 API Server&#xff0c;通過負載均衡器&#xff08;如 Nginx、HAProxy、云廠商 LB&#xff09;對外提供統一入口。 ? 選舉機制&#xff1a;Sche…

記錄心態和工作變化

忙中帶閑的工作 其實工作挺忙的, 總是在趕各種功能點. 好巧的是iOS那邊因為上架的問題耽擱了一些時間, 從而讓Android的進度有了很大的調整空間. 更巧的是后端那邊因為對客戶端的需求不是很熟悉, 加上Android海外這塊的業務他也是第一次接觸. 所以需要給他留一些時間把各個環節…

JVM 雙親委派機制

一、從 JDK 到 JVM&#xff1a;Java 運行環境的基石 在 Java 開發領域&#xff0c;JDK&#xff08;Java Development Kit&#xff09;是開發者的核心工具包。它不僅包含了編譯 Java 代碼的工具&#xff08;如 javac&#xff09;&#xff0c;還內置了 JRE&#xff08;Java Run…

java開發之異常

一 結構 Throwable分為Exception和error Exception分為RuntimeException&#xff08;運行時異常&#xff09;和其他異常 主動拋出運行時異常和非運行時異常的區別 1、throw RuntimeException&#xff08;或運行時異常的子類&#xff09; 編譯時不會報錯。 2、throw Excepti…

MySQL 中 JOIN 和子查詢的區別與使用場景

目錄 一、JOIN:表連接1.1 INNER JOIN:內連接1.2 LEFT JOIN:左連接1.3 RIGHT JOIN:右連接1.4 FULL JOIN:全連接二、子查詢:嵌套查詢2.1 WHERE 子句中的子查詢2.2 FROM 子句中的子查詢2.3 SELECT 子句中的子查詢三、JOIN 和子查詢的區別3.1 功能差異3.2 性能差異3.3 使用場…

2025年第三屆盤古石杯初賽(智能冰箱,監控部分)

前言 所以去哪里可以取到自己家里的智能家居數據呢&#xff1f;&#xff1f;&#xff1f;&#xff1f; IOT物聯網取證 1、分析冰箱&#xff0c;請問智能冰箱的品牌&#xff1f; [答案格式&#xff1a;xiaomi] Panasonic2、請問智能冰箱的型號&#xff1f; [答案格式&#x…

【強化學習】強化學習算法 - 馬爾可夫決策過程

文章目錄 馬爾可夫決策過程 (Markov Decision Process, MDP)1. MDP 原理介紹2. MDP 建模/實現步驟3. MDP 示例&#xff1a;簡單網格世界 (Grid World) 馬爾可夫決策過程 (Markov Decision Process, MDP) 1. MDP 原理介紹 馬爾可夫決策過程 (MDP) 是強化學習 (Reinforcement L…

用戶現場不支持路由映射,如何快速將安防監控EasyCVR視頻匯聚平臺映射到公網?

一、方案背景? 隨著數字化安防與智能交通管理發展&#xff0c;視頻監控遠程管理需求激增。EasyCVR作為專業視頻融合平臺&#xff0c;具備多協議接入等核心功能&#xff0c;是智能監控的重要工具。但實際部署中&#xff0c;當EasyCVR處于內網且路由器無法進行端口映射時&#…

MODBUS RTU調試助手使用方法詳解

一、軟件簡介 485調試助手是一款常用的串口通信調試工具&#xff0c;專門用于RS-485總線設備的測試、調試和通信監控。它支持多種串口參數設置&#xff0c;提供數據收發功能&#xff0c;是工業現場調試的必備工具之一。 二、軟件安裝與啟動 1. 系統要求 Windows 7/10/11操作…

ECMAScript 2018(ES2018):異步編程與正則表達式的深度進化

1.版本背景與發布 發布時間&#xff1a;2018年6月&#xff0c;由ECMA International正式發布&#xff0c;標準編號為ECMA-262 9th Edition。歷史意義&#xff1a;作為ES6之后的第三次年度更新&#xff0c;ES2018聚焦于異步編程、正則表達式和對象操作的標準化&#xff0c;推動…

【C語言】鏈接與編譯(編譯環境 )

前言&#xff1a; 在前面講解文件操作&#xff0c;了解了文件的類別&#xff0c;文件的打開與關閉&#xff0c;字符讀寫函數&#xff0c; 字符串讀寫函數&#xff0c;格式化輸入輸出函數 在C語言編程中&#xff0c;編譯與鏈接是將源代碼轉化為可執行程序的關鍵步驟。為了詳細…

Java視頻流RTMP/RTSP協議解析與實戰代碼

在Java中實現視頻直播的輸入流處理&#xff0c;通常需要結合網絡編程、多媒體處理庫以及流媒體協議&#xff08;如RTMP、HLS、RTSP等&#xff09;。以下是實現視頻直播輸入流的關鍵步驟和技術要點&#xff1a; 1. 視頻直播輸入流的核心組件 網絡輸入流&#xff1a;通過Socket或…

系分論文《論系統需求分析方法及應用》

系統分析師論文范文系列 【摘要】 2022年6月&#xff0c;我作為系統分析師參與了某金融機構“智能信貸風控系統”的建設項目。該系統旨在通過對業務流程的數字化重構&#xff0c;優化信貸審批效率并降低風險。項目涉及信貸申請、資質審核、風險評估、額度審批等核心流程&#x…

stack和queue簡單模擬實現

stackreverse_iteratorqueuepriority_queue仿函數具體代碼 stack Stacks are a type of container adaptor, specifically designed to operate in a LIFO context (last-in first-out), where elements are inserted and extracted only from one end of the container. 上述描…