C++map類型 之 簡單介紹

一:map的前世今生

(1)從關聯容器與順序容器說起。關聯容器通過鍵(key)存儲和讀取元素。而順序容器則通過元素在容器中的位置順序存儲和訪問元素(vector,queue,stack,list等)。

關聯容器(Associative containers)支持通過鍵來高效地查找和讀取元素。

兩個主要的關聯容器類型是 map 和 set。

當中map 的元素以鍵-值(key-value)對的形式組織:鍵用作元素在 map 中的索引,而值則表示所存儲和讀取的數據。set 僅包括一個鍵。并有效地支持關于某個鍵是否存在的查詢。

(2)關聯容器類型


標準庫提供了8個關聯容器,例如以下表。

有序容器:類型map和multimap定義在頭文件map中,set和multiset定義在頭文件set中;無序容器:則分別定義在unordered_map 和unordered_set中。

1-- 說明:map類型通常被稱為關聯數組(associative array),關聯數組和正常數組以“正常”數組類似,不同之處在于其下標不必是整數。

我們通過一個keyword而不是位置來查找值。與之相對。set就是keyword的簡單集合。當僅僅是想知道一個值是否存在時。set是最實用的。

2-- 使用map

// 統計每一個單詞輸入的個數
map<string,size_t> word_count;    // string 到 size_t的空map
string word;
while(cin >> word)++word_count[word];        // 提取word 的計數器并將其加 1

3--使用set

map<string,size_t> word_count;      // string 到 size_t的空map
set<string> exclude = {“The”, “But”, “And”, “Or”, “An”, “A”, “Then”,
“the”, “but”, “and”, “or”, “an”, “a”, “then”};
string word;
while(cin >> word)// 僅僅統計不在exclude中的單詞If(exclude.find(word) == exclude.end() )++word_count[word];        // 提取word 的計數器并將其加 1
4--?

注意:關聯容器對其keyword類型有一些限制。默認情況下,標準庫使用keyword類型的< 運算符來比較兩個keyword。

pair 類型

在介紹關聯容器操作之前,我們須要了解名為pair的標準庫類型,它定義在頭文件utility中。一個pair保存兩個數據成員,first 和 second?


(3)一般來說。假設希望有效地存儲不同值的集合。那么使用 set 容器比較合適,而 map容器則更適用于須要存儲(乃至改動)每一個鍵所關聯的值的情況在做某種文本處理時,可使用 set 保存要忽略的單詞。

而字典則是 map 的一種非常好的應用

:單詞本身是鍵,而它的解釋說明則是值。 set 和 map 類型的對象所包括的元素都具有不同的鍵,不同意為同一個鍵加入第二個元素。假設一個鍵必須相應多個實例,則需使用 multimap 或 multi set,這兩種類型同意多個元素擁有同樣的鍵。



二:map簡單介紹(官方簡單介紹)



(1)map是一類關聯式容器。它是模板類。

關聯的本質在于元素的值與某個特定的鍵相關聯,而并不是通過元素在數組中的位置類獲取。它的特點是添加和刪除節點對迭代器的影響非常小,除了操作節點,對其它的節點都沒有什么影響。對于迭代器來說,不能夠改動鍵值,僅僅能改動其相應的實值。

(2)map的功能
自己主動建立Key - value的相應。

key 和 value能夠是隨意你須要的類型。可是須要注意的是對于key的類型,唯一的約束就是必須支持<操作符。
依據key值高速查找記錄,查找的復雜度基本是Log(N)。假設有1000個記錄,最多查找10次。1,000,000個記錄。最多查找20次。
高速插入Key - Value 記錄;高速刪除記錄。依據Key 改動value記錄;遍歷全部記錄。



(3)map的定義
使用map得包括map類所在的頭文件:#include <map> //注意,STL頭文件沒有擴展名.h
map對象是模板類,須要keyword和存儲對象兩個模板參數。主要的定義模式例如以下:
std:map<int, string> personnel;
這樣就定義了一個以int為鍵,值為string的map對象personnel。

map中定義了下面三個類型:
map<K, V>::key_type : 表示map容器中,索引的類型。
map<K, V>::mapped_type : 表示map容器中,鍵所關聯的值的類型;
map<K, V>::value_type : 表示一個pair類型,它的first元素具有const map<K, V>::key_type類型。而second元素則有map<K, V>::mapped_type類型
對迭代器進行解引用時。將獲得一個引用。指向容器中一個value_type類型的值,對于map容器,其value_type是pair類型。

為了使用方便,能夠對模板類進行一下類型定義。

typedef map<int, CString> UDT_MAP_INT_CSTRING;?
UDT_MAP_INT_CSTRING enumMap;

三:在map中加入元素
給map中加入元素主要有兩種方法:
?(1)使用下標操作符獲取元素,然后給元素賦值
? ? ? ? ? For example:
? ? ? ? ? map<string, int> word_count; // 定義了一個空的map對象word_count;
? ? ? ? ? word_count["Anna"] = 1;?

程序說明:
1.在word_count中查找鍵為Anna的元素,沒有找到.
2.將一個新的鍵-值對插入到word_count中。他的鍵是const string類型的對象,保存Anna。

而他的值則採用直初始化,這就意味著在本例中指為0.
3.將這個新的鍵-值對插入到word_count中
4.讀取新插入的元素,并將她的值賦為1.
使用下標訪問map與使用下標訪問數組或者vector的行為是截然不同的:使用下標訪問不存在的元素將導致在map容器中加入一個新的元素。他的鍵即為該下標值。

(2)使用map::insert方法加入元素
? ? ?map容器提供的insert操作:
1. map.insert(e) : e是一個用在map中的value_type類型的值。假設鍵不存在,則插入一個值為e.second的新元素。假設鍵在map中已經存在,那么不進行不論什么操作。

該函數返回一個pair類型,該pair類型的first元素為當前插入e的map迭代器,pair的second類型是一個bool類型,表示是否插入了該元素。
2. map.insert(beg, end) : beg和end是迭代器。返回void類型
3. map.insert(iter, e) : e是value_type類型的值,假設e.first不在map中,則創建新元素,并以迭代器iter為起點搜索新元素存儲的位置。返回一個迭代器,指向map中具有給定鍵的元素。
For example:
? ? word_count.insert(map<sting, int>::value_type("Anna", 1));
word_count.insert(make_pair("Anna", 1));?
返回值:假設該鍵已在容器中。則其關聯的值保持不變,返回的bool值為true。

(3)查找并獲取map中的元素

使用下標獲取元素存在一個非常危急的副作用:假設該鍵不在map容器中,那么下標操作會插入一個具有該鍵的新元素。
因此引入map對象的查詢操作:
map.count(k) : 返回map中鍵k的出現次數(對于map而言。因為一個key相應一個value,因此返回僅僅有0和1,因此能夠用此函數推斷k是否在map中)
map.find(k) : ?返回map中指向鍵k的迭代器。假設不存在鍵k,則返回超出末端迭代器。

For example:
int occurs = 0;
if( word_count.cout("foobar") )
? ? ?occurs = word_count["foobar"];
int occurs = 0;
map<string, int>::iterator it = word_count.find("foobar");
if( it != word_count.end() )
? ? ?occurs = it ->second;

(4)從map中刪除元素
移除某個map中某個條目用erase()
該成員方法的定義例如以下:
iterator erase(iterator it); //通過一個條目對象刪除
iterator erase(iterator first, iterator last); ? ? ? ?//刪除一個范圍
size_type erase(const Key& key); //通過keyword刪除

(5) map對象的迭代遍歷

與其它容器一樣。map相同提供begin和end運算,以生成用于遍歷整個容器的迭代器。

轉載于:https://www.cnblogs.com/zsychanpin/p/6755044.html

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

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

相關文章

MySql Socket 完成數據庫的增查Demo

需求: 利用MySql數據庫結合前端技術完成用戶的注冊(要求不使用Web服務技術),所以 Demo采用Socket技術實現Web通信. 第一部分:數據庫創建 數據庫采用mysql 5.7.18, 數據庫名稱為MyUser, 內部有一張表 user.字段有 Id,UserName,Psd,Tel 第二部分:數據庫連接與Socket通信 創建控…

oracle導數卡死,oracle-審計導數

1、因審計需求&#xff0c;需要將MySQL、Oracle數據庫中需要的表數據導入到SqlSERVER進行審計。2、之前的方法&#xff1a;A. oracle組將表dump下來&#xff0c;進行壓縮&#xff0c;傳送到oracle導數服務器(中轉服務器)&#xff0c;再進行還原&#xff0c;然后修改表結構&…

蘋果桌面主題_看膩了手機自帶的桌面主題,試試這個

在這個看臉的時代&#xff0c;顏值似乎越來越重要了。尤其是我們每天都要看到的手機桌面&#xff0c;如果它的顏值好一點&#xff0c;也許我們的心情會更好&#xff0c;所以有不少人都用手機自帶的主題來美化桌面&#xff0c;但是對于喜歡個性的我們&#xff0c;手機自帶的主題…

Java SE 11:推動Java向前發展

介紹 在我看來&#xff0c;這篇文章提出了Java語言應該如何發展以保持其作為首選語言的地位。 它還提供了一些我喜歡但有時&#xff08;可能永遠不會&#xff09;成為Java一部分的功能&#xff0c;由于我將要解釋的某些原因&#xff0c;這些功能有時我已經愛上了。 我真的很想…

python之property屬性

Property的概念&#xff1a;property是一種特殊的屬性&#xff0c;訪問它時會執行一段功能&#xff08;函數&#xff09;&#xff0c;然后返回值。 import mathclass Circle:def __init__(self,radius):#園的半徑radiusself.radiusradiusproperty#areaproperty(area)def area(s…

Hexo使用細節及各種問題

解決markdown圖片不顯示(返回403 forbidden)、添加本地圖片無法顯示、修改文章page模板、同時部署發布同步到多個倉庫站點(Github、coding、gitee 碼云) 圖片不顯示 在使用過程中&#xff0c;會發現有的引用圖片無法顯示的問題。但是如果直接復制圖片地址到瀏覽器打開的話顯示…

oracle的等保,Oracle等保測評相關指令

Oracle用戶管理:SQL*Pluscreate user 用戶名 identified by 密碼; //創建用戶grant 權限(dba管理員&#xff0c;resource普通用戶&#xff0c;connect訪客) to 用戶名; //授權drop user 用戶名 cascade; //刪除用戶&#xff0c;加cascade會把用戶創建的所有東西刪除Linux設置用…

Spring3 + JPA2 + Java EE6 App Server =配置混亂

Spring很棒&#xff0c;JavaEE6很棒&#xff0c;最新的JavaEE6 Application服務器也很棒。 這篇文章不是Spring Vs JavaEE6上的專欄文章&#xff0c;而是我在JBoss AS-7.1 App Server上移植Spring3 JPA2&#xff08;Hibernate&#xff09;應用程序的經驗。 我的應用程序要求非…

python面向對象進階(1)

面向對象進階 isinstance(obj,cls) 檢查是否obj是類cls的對象class Foo(object): passobj Foo() isinstance(obj,Foo)issubclass(sub,super) 檢查sub是否是super的派生類class Foo(object): passclass Bar(Foo): passissubclass(Bar,Foo) 反射python面向對象中的反射&#xff…

智能小車37:異常在ARM、JAVA、硬件里的實現

幾乎所有編程語言都有異常&#xff0c;可以說有程序就有異常。今天學習Arm的中斷(異常)處理,聯想到Java的異常,硬件中如何實現等問題&#xff0c;下面給大家分享一下。 一、Arm的中斷。 1.觸發異常 2.保存現場 3.cpu進入異常工作模式&#xff0c;程序指針(pc)跳入異常入口&…

c++builder提高批量動態創建panel的速度_騎行時影響速度的事項有哪些 怎樣有效提高騎行速度 單車租賃信息...

撇開人的因素在自行車的組件中對車速影響最大的幾項是什么?車重?自鎖?輪組?傳動?我的個人感受&#xff0c;從提高幅度上來講&#xff0c;而不是重要性上來講一、自鎖起碼提高你50%的速度&#xff0c;我不用自鎖和別人一起走AVS25就很辛苦了&#xff0c;用了自鎖&#xff0…

ansys matlab 調用,matlab 調用ansys (轉載)

問題的提出&#xff1a;我們經常會需要用ansys計算一些東西&#xff0c;之后再用matlab來處理計算的結果。當修改某些參數重復上述過程的時候&#xff0c;就比較容易出現問題——比如ansys模型中的參數和matlab程序中參數的一致性問題等。這時可以考慮采用下面的協同工作的方法…

本地存儲之sessionStorage

源碼可以到GitHub上下載&#xff01; sessionStorage&#xff1a; 關閉瀏覽器再打開將不保存數據 復制標簽頁會連同sessionStorage數據一同復制 復制鏈接地址打開網頁不會復制seessionStorage內的數據 清除緩存加載當前頁對頁面無影響 1) 同源策略限制。若想在不同頁面之間對同…

哈希三道題

兩數之和 給定一個整數數組 nums 和一個整數目標值 target&#xff0c;請你在該數組中找出 和為目標值 target 的那 兩個 整數&#xff0c;并返回它們的數組下標。 你可以假設每種輸入只會對應一個答案。但是&#xff0c;數組中同一個元素在答案里不能重復出現。 你可以按任意…

zemax光學設計超級學習手冊_穿越十年的一個ZEMAX光學設計案例

目前超過兩千人的光學與光學設計方面的微信公眾號&#xff0c;歡迎您&#xff01;穿越十年的一個ZEMAX光學設計案例作者&#xff1a;窗臺小綠蘿CAD&#xff0c;這個詞已經深入到學習、工作很多年&#xff0c;翻譯過來就是Computer Aided Design&#xff0c;計算機輔助設計。隨著…

Java本質和性能

最初的問題是如何計算二進制數中1的個數&#xff1f; 我包含了使用Integer.bitCount&#xff08;&#xff09;的性能比較&#xff0c;該性能可以轉換為固有特性&#xff0c;即單個機器代碼指令POPCNT和執行相同功能的Java代碼。 題 如何計算二進制數中1的個數&#xff1f; 假…

spring RequestMapping 包含http的部分以及各部分詳解

RequestMapping有四個參數&#xff0c;分別為&#xff1a;1、value&#xff1a;表示請求URL2、method&#xff1a;表示請求方法3、params&#xff1a;表示請求參數4、headers&#xff1a;表示請求頭 【例如】&#xff1a;RequestMapping(value"/testRequestMapping",…

【ZBH選講·拍照】

【問題描述】 假設這是一個二次元。LYK召集了n個小伙伴一起來拍照。他們分別有自己的身高Hi和寬度Wi。為了放下這個照片并且每個小伙伴都完整的露出來&#xff0c;必須需要一個寬度為ΣWi&#xff0c;長度為max{Hi}的相框。&#xff08;因為不能疊羅漢&#xff09;。LYK為了節省…

php基礎是什么,php基礎學什么?

有不少同學想要學習 PHP&#xff0c;但又不清楚 PHP 基礎學什么&#xff0c;那么這篇文章告訴你。熟悉前端開發語言學習 PHP 之前&#xff0c;首先要學習前端語言包括 HTML、CSS、JS 等。等對前端語言有個大致掌握后&#xff0c;能編寫一個 web 靜態頁面。學習 PHP 基本語法和函…

名為 cursor_jinserted 的游標不存在_生鮮電商存在的問題及對策解析:未來生鮮電商如何發展?...

生鮮電商的特點有哪些&#xff1f;生鮮電商特點&#xff1a;1,生鮮電商具有粘性高、重復購買率高、毛利高的“三高”特性&#xff1b;2,生鮮食品需要保鮮、冷藏、冷凍&#xff1b;3,生鮮食品保質期比較短&#xff1b;保存不易、對物流配送的條件要求極高&#xff1b;4,生鮮商品…