C++ STL學習筆記 : 2. unordered map 容器

本文中,簡單總結一下使用unordered map 的心得。unordered_map容器屬于STL中關聯表的一種,常用的map容器與unordered_map容器在使用中有著很大程度的相同點,在之后的文章中我可能會針對二者的相同點與不同點進行細致的分析,這里就不過多贅述,只是簡單地和大家一起了解一下unordered_map的一些基本使用。
關聯表作為STL庫中的一類常見的容器,其結構和數組類似。與數組不同的是,關聯表中有兩個類型,鍵key索引類和被索引的元素類。Key值和元素的關系我們可以理解為映射關系。一個鍵值有且僅有一個對應的元素。
在這里插入圖片描述
同時,關聯表中使用的索引類,不再是簡單的自然數,而是可以根據需要選擇使用string字符串類,或自定義的類作為索引key的類型。不再使用自然數作為索引讓關聯表的使用相較于數組更加靈活,但需要注意的是,一個關聯表中的所有鍵都應該是同一類型,所有被索引的元素也應該是同一類型。這兩個類型在定義關聯表的同時進行定義。下面我們就回到關聯表中的一種容器,本篇文章的主角 : unordered_map的使用。

0.include相關庫。

# include <unordered_map>

1.定義一個一維的unordered map:

第一部分,如何定義一個空的unordered_map容器。

unordered_map<uint64_t,string> mymap;
unordered_map<uint64_t,uint64_t> mymap2a
unordered_map<string,string>mymap3;

<>中的第一個參數是key的類型,第二個參數是對應的元素集的數據類型。unordered_map類可以理解為一個使用key作為角標標注的列表,只不過這個列表是無序的,且列表的序號也不再要求一定是正整數。與數組比較,unordered map等容器更加自由,更易于查找。

2.向unordered_map里添加項:

這個部分我們介紹一些向unordered_map里添加項的方法。

// 1. 使用insert方法
mymap.insert(make_pair(10,"nihao"));
mymap.insert(pair<uint64_t,string>(20,"hello"));
uint64_t ind = 30;
string toto = "hello";
mymap.insert(pair<uint64_t,string>(ind,toto));
//2. 使用角標直接賦值
mymap[40] = "nihaoma";

需要注意的是,一個key只能對應一個存儲的數據。如果key已經存在了,使用insert方法對已存在的key進行插入操作不會覆蓋之前key對應的值,而使用中括號,類似數組的賦值方法,例如mymap[10]="hahaha"可以覆蓋已存在的key所對應的值。當然,如果使用中括號賦值時中括號中的key值在容器中不存在,那么此時中括號賦值的效果和使用insert方法一致,會為容器添加一個新的key 鍵,并插入對應的值。這一點在接下來我們使用二維unordered_map時還會進一步說明。

3.迭代器 iterator

由于unordered_map其中的項是沒有順序排列的,且鍵值可以不為正整數,因此為了對unordered_map中的每一項進行操作,且和數組一樣滿足我們遍歷的需要,就必須使用迭代器。
迭代器的定義方法很簡單,C<>::iterator name_iterator;
延續上述例子, 迭代器的定義方法代碼如下:

unordered_map<uint64_t,string>::iterator ite_mymap;

迭代器可以使用容器的begin()或end()方法進行初始化 :

unordered_map<uint64_t,string>::iterator ite_mymap(mymap.begin());

迭代器可以理解為指向容器某一項的指針,每一項都包含一個key值和一個元素值,和指針一樣,用*ite_mymap可以對迭代器取值。下述代碼是一個簡單的使用迭代器讀取key值和元素值的例子:

#include <iostream>
#include <unordered_map>
using namespace std;
int main()
{unordered_map < uint64_t, uint64_t > mymap;mymap.insert(make_pair(10, 20));unordered_map < uint64_t, uint64_t >::iterator ite_mymap(mymap.begin());cout << (*ite_mymap).first<<endl;cout << (*ite_mymap).second << endl;cout << ite_mymap->first << endl;cout << ite_mymap->second << endl;return 0;
}

執行結果如下 :
在這里插入圖片描述

通過上述代碼以及執行結果我們不難看出,容器中的每一項,都包含有first和second兩個屬性,分別對應了key 鍵值和元素值。我們既可以通過指向項的迭代器指針讀取這兩個屬性,同時也可以使用取值符號,直接通過項來讀取這兩個屬性。

4. 使用迭代器遍歷

有了在上述步驟中的認識,使用迭代器遍歷容器也變得非常簡單,使用一個for循環就可以遍歷容器并利用迭代器進行操作了 :

for(ite_mymap=mymap.begin();ite_mymap!=mymap.end();ite_mymap++)
{...
}

5.二維unordered_map的使用

通過上面的幾個部分,我們已經大致了解了一維unordered_map的使用。正如一開始我們提到的,unordered_map中被索引的元素類型可以是任意類,二維unordered_map實際就是被索引的元素集是令一個unordered_map類,這樣就構成了二維的unordered_map。下面是一個簡單的例子:

unordered_map<uint64_t, unordered_map<uint64_t, uint64_t>> mymap;
unordered_map<uint64_t, uint64_t> tmp;
tmp.insert(make_pair(10, 25));
mymap.insert(pair < uint64_t, unordered_map<uint64_t, uint64_t>>(10, tmp));
mymap[10][20] = 30;
mymap[10][40] = 35;
mymap[20][40] = 50;
unordered_map<uint64_t, unordered_map<uint64_t, uint64_t>>::iterator multitr;
unordered_map<uint64_t, uint64_t>::iterator intertr;
for(multitr=mymap.begin();multitr!=mymap.end();multitr++){for(intertr= multitr ->second.begin(); intertr != multitr ->second.end(); intertr ++)std::cout<< multitr ->first<<" "<<intertr->first<<" ("<< intertr -> second <<")"<<endl;}

輸出結果如下 :
在這里插入圖片描述
上述例子中,我們定義了unordered_map mymap,其鍵key類型為uint64_t,對應的元素類型為另一個unordered_map類。對于mymap來說,一個鍵對應一個unordered_map類的元素。對于二維unordered_map的遍歷,我們定義兩個迭代器,一個外部迭代器,一個內部迭代器。類似二維數組的遍歷,我們使用for循環的嵌套來遍歷二維的unordered_map。

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

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

相關文章

tensorflow 安裝在Anaconda

python環境&#xff1a;win10 64下anaconda4.2.0(python3.5)。安裝tensorflow過程是在Anaconda Prompt中進行安裝 1&#xff1a;打開Anaconda Prompt 在安裝之前&#xff0c;說幾個關于conda的小命令 conda list&#xff1a;可以顯示已經安裝好的庫。 conda install 庫名 &…

伯努利數學習筆記的說...

經過一天的學習&#xff0c;我們發現伯努利數是個非常有用 &#xff08;個屁&#xff09; 的數列 定義 但是...伯努利數是什么呢&#xff1f;我們先給伯努利數一個定義&#xff1a; 令 \(B(i)\) 表示 伯努利數第 i 項&#xff0c;那么有&#xff1a; \[\sum_{i0}^{n} \begin{pm…

Dijkstra迪杰斯特拉算法 C++實現

本篇文章主要介紹了Dijkstra迪杰斯特拉算法的C實現&#xff0c;文章包含兩個部分&#xff0c;在第一部分中我會簡單介紹迪杰斯特拉算法以及一些個人的理解&#xff0c;第二部分會對C代碼的邏輯進行解釋。下面是我已經上傳的代碼資源&#xff0c;大家有興趣的可以點擊鏈接下載資…

Python開發一個股票類庫

前言 使用Python開發一個股票項目。 項目地址&#xff1a; https://github.com/pythonstock/stock 相關資料&#xff1a; http://blog.csdn.net/freewebsys/article/details/78294566 主要使用開發語言是python。 使用的lib庫是pandas&#xff0c;tushare&#xff0c;Tens…

LeetCode 105. Construct Binary Tree from Preorder and Inorder Traversal 由前序和中序遍歷建立二叉樹 C++...

LeetCode 105. Construct Binary Tree from Preorder and Inorder Traversal 由前序和中序遍歷建立二叉樹 C Given preorder and inorder traversal of a tree, construct the binary tree. Note:You may assume that duplicates do not exist in the tree. For example, given…

C++ STL 學習筆記 3. 文本文件操作

本文主要總結了C中對文本文件的基本操作以及使用心得&#xff0c;第一部分中總結了C對文本文件的基本操作&#xff0c;第二部分中會以csv文件為例&#xff0c;進行讀取存儲由逗號分隔的字符串的操作。 1. 文本讀取寫入基礎 要使用文件輸入輸出流&#xff0c;首先需要include相…

C# 調用python

1.C# 調用python 本質上是使用命令行運行python 1.1 C# 使用命令行 program.cs using System; using System.Diagnostics; using System.IO;namespace test {class Program{static void Main(string[] args){Program p new Program();string result p.run_cmd("ping…

4-17

1、html 中div class是什么&#xff1f; 在這里我將用id與class的比較&#xff0c;讓這個問題更容易理解&#xff08;1&#xff09;、使用區別id具有唯一性&#xff0c;在一個網頁中同一個命名只能使用一次&#xff1b;class命名的類可以在一個網頁中使用無數次。&#xff08;2…

python pandas serie簡介及基本使用

本篇文章主要羅列了pandas模塊中serie的基本使用。環境是jupyter notebook python 3.7。 serie是能夠保存任何類型數據的一維數組&#xff0c;軸標簽統稱為索引&#xff0c;索引必須是唯一的散列且與數據的長度相同&#xff0c;默認情況下為np.arange(n)。 首先是import pand…

Linux系統中nc工具那些不為人知的用法

Linux nc命令用法 參考地址&#xff1a;https://www.cnblogs.com/jjzd/p/6306273.html -g<網關>&#xff1a;設置路由器躍程通信網關&#xff0c;最多設置8個; -G<指向器數目>&#xff1a;設置來源路由指向器&#xff0c;其數值為4的倍數; -h&#xff1a;在線幫助;…

python pandas dataframe基本使用整理

dataframe是一種表格型的數據存儲結構&#xff0c;可以看作是幾個serie的集合。dataframe既有行索引&#xff0c;也有列索引。 以下代碼環境為google colab/jupyter notebook。 接下來就對dataframe的基本使用進行整理。 dataframe也從屬于pandas模塊&#xff0c;因此還是老規矩…

常見開源分布式存儲系統

對比說明 /文件系統 TFS FastDFS MogileFS MooseFS GlusterFS Ceph 開發語言 C C Perl C C C 開源協議 GPL V2 GPL V3 GPL GPL V3 GPL V3 LGPL 數據存儲方式 塊 文件/Trunk 文件 塊 文件/塊 對象/文件/塊 集群節點通信協議 私有協議&#xff08;T…

[十二省聯考2019]皮配

題目鏈接 選一個派系和一個陣營可以唯一確定一名導師 因為每一個陣營里的導師都分別來自不同派系&#xff0c;所以k0時&#xff0c;對陣營的選擇是不影響對派系的選擇的 唯一的限制就是同城市的要在同一個陣營 所以以每個城市為物品&#xff0c;物品大小為該城市的人數&#xf…

機器學習理論梳理1: PCA主成分分析

機器學習的理論部分學習知識點比較亂且雜。我這里通過幾篇文章&#xff0c;簡單總結一下自己對機器學習理論的理解&#xff0c;以防遺忘。第一篇文章主要概述了機器學習的基本任務以及一個常用的降維方法&#xff0c;主成分分析。 機器學習的基本任務 機器學習能實現許多不同…

29 _react-router說明

一、SPA的理解 1.單頁面web應用(single page web application ,SPA) 2.整個應用只有一個完整的頁面 3.點擊頁面中的鏈接不會刷新頁面&#xff0c;本身也不會向服務器發請求 4.當點擊路由鏈接時&#xff0c;只會做頁面的局部更新 5.數據都需要通過ajax請求獲取&#xff0c;并在前…

Java程序員如何快速理解Kubernetes

我們希望微服務是可復制的&#xff0c;可替換的工作節點&#xff0c;這樣可以輕松進行升級或降級&#xff0c;同時無需任何停機時間&#xff0c;并花費最少代價的管理。我們可以說我們希望他們成為我們的小黃人&#xff08;minions&#xff09;。本文我們將通過一個簡單的例子來…

NLP基礎 : HMM 隱馬爾可夫模型

Hidden Markov Model, HMM 隱馬爾可夫模型&#xff0c;是一種描述隱性變量(狀態)和顯性變量(觀測狀態)之間關系的模型。該模型遵循兩個假設&#xff0c;隱性狀態i只取決于前一個隱性狀態i-1&#xff0c;而與其他先前的隱形狀態無關。觀測狀態也只取決于當前的隱形狀態。因此我們…

關于秒殺系統優化方向

今天聽了一節咕泡學院的公開課&#xff0c;有收獲。 秒殺系統的特點&#xff1a; 1.限時&#xff1b;2.限量供應&#xff1b;3.并發量大&#xff1b;如何優化&#xff1a; 1.客戶端數據緩存。 2.CDN加速。 3.nginx動靜分離&#xff0c;靜態資源緩存&#xff0c;負載均衡。 4.se…

Mysql插入很慢,找到了稍微快點的方法

MYSQL批量插入數據庫實現語句性能分析 假定我們的表結構如下 代碼如下 CREATE TABLE example ( example_id INT NOT NULL, name VARCHAR( 50 ) NOT NULL, value VARCHAR( 50 ) NOT NULL, other_value VARCHAR( 50 ) NOT NULL ) 通常情況下單條插入的sql語句我們會這么寫&…

Linux - 時間相關命令 - ntpdate, date, hwclock

1. 概述 最近也不知道寫啥了, 把之前的老文檔整理一下, 湊個數什么的配置時間這種工作, 偶爾還是要用一下主要描述 3 個命令的簡單適用 ntpdatehwlock2. ntpdate 1. 概述 用于同步時鐘的命令2. 機制 通常是有一個服務器對外提供時間客戶端可以與時間服務器同步ntp 是他們之間交…