1. 程式人生 > >C++的STL容器之關聯性容器set、multiset、map、multimap

C++的STL容器之關聯性容器set、multiset、map、multimap

STL對定義的通用容器分三類:順序性容器關聯式容器容器介面卡

順序性容器:vector、list、deque

關聯性容器:set、multiset、map、multimap

容器介面卡:stack、queue、priority_queue

本篇主要總結關聯性容器:

(btw:獲取迭代器的方法:建物件方式::iterator iter;  //例:map<int,string>::iterator iter; )

1.set:

set,顧名思義是“集合”的意思,在set中元素都是唯一的,而且預設情況下會對元素自動進行升序排列,支援集合的交(set_intersection),差(set_difference) 並(set_union),對稱差(set_symmetric_difference) 等一些集合上的操作,如果需要集合中的元素允許重複那麼可以使用multiset。

(1)初始化set物件的方式:

set<int > seta;    //預設是小於比較器less<int>的set
set<int, greater<int> > setb;   //建立一個帶大於比較器的set,需包含標頭檔案functional

int a[5] = {1,2,3,4,5};set<int > setc(a,a+5);  //陣列a初始化一個set;set<int > setd(setc.begin(),setc.end()); //setc初始化一個set//上述兩例均為區間初始化

set<int > sete(setd); //拷貝構造建立set

 (2)set常用函式:

s.begin()      返回set容器的第一個元素
s.end()      返回set容器的最後一個元素
s.clear()       刪除set容器中的所有的元素
s.empty()     判斷set容器是否為空
s.insert()      插入一個元素
s.erase()       刪除一個元素

s.size()     返回當前set容器中的元素個數

s.count()      返回某個值元素的個數

equal_range() 返回第一個>=關鍵字的迭代器和>關鍵字的迭代器

語法:
pair <iterator,iterator>equal_range( const key_type &key );
//key是用於排序的關鍵字Set<int> ctr;
例如:
Pair<set<int>::iterator,set<int>::iterarot>p; For(i=0;i<=5;i++) ctr.insert(i); P=ctr.equal_range(2);
那麼*p.first==2;*p.second==3;
erase() 刪除集合中的元素
語法:
iterator erase( iterator i ); //刪除i位置元素
iterator erase( iterator start, iterator end );
//刪除從start開始到end(end為第一個不被刪除的值)結束的元素size_type erase( const key_type &key );
//刪除等於key值的所有元素(返回被刪除的元素的個數)
//前兩個返回第一個不被刪除的雙向定位器,不存在返回末尾
//第三個返回刪除個數
find() 返回一個指向被查詢到元素的迭代器
語法:
iterator find( const key_type &key );
//查詢等於key值的元素,並返回指向該元素的迭代器;

//如果沒有找到,返回指向集合最後一個元素的迭代器

lower_bound()--返回指向大於(或等於)某值的第一個元素的迭代器

upper_bound()--返回大於某個值元素的迭代器

value_comp()--返回一個用於比較元素間的值的函式

2.multiset

set和multiset會根據特定的排序準則,自動將元素進行排序。不同的是後者允許元素重複而前者不允許。multiset和set用法基本一致。

3.map

map是STL的一個關聯容器,它提供一對一(其中第一個可以稱為關鍵字,每個關鍵字只能在map中出現一次,第二個可能稱為該關鍵字的值)的資料處理能力,使用的是一個包含鍵和值的pair的物件。由於這個特性,它完成有可能在我們處理一對一資料的時候,在程式設計上提供快速通道。

(1)初始化map物件的方式:

map<key,value>m;  //建立一個名為m的空map物件,其鍵和值的型別分別為key和value。

map<key,value>m(m2);  //建立m2的副本m,m與m2必須有相同的鍵型別和值型別。

map<key,value>m(b,e);   //建立map型別的物件m,儲存迭代器b和e標記的範圍內所有元素的副本,元素的型別必須能轉換為pair

map<key,value,comp>m;   //comp可選,為鍵值對存放策略,即鍵的比較函式,預設標準庫使用鍵型別定義的 < 操作符來實現鍵的比較。所用的比較函式必須在鍵型別上定義嚴格的弱排序,可將其理解為鍵型別資料上的“小於”關係。在實際應用中,鍵型別必須能定義 < 操作符。對於鍵型別,其唯一的約束就是必須支援 < 操作符。

(2)map常用函式

四種插入資料的方法:

1.insert(pair<int, string>(1, "student_one")):         //用insert函式插入pair元素

2.insert(map<int, string>::value_type (1, "student_one"));    // 用insert函式插入value_type資料

3. map<char, string>,char c='1',mp[c]="student_one"    //用陣列方式插入資料

4.map.insert(make_pair(1, "student_one"));       //在insert函式中使用make_pair()函式

begin():返回容器第一個元素的迭代器

end():返回容器最後一個元素之後的迭代器

rbegin():返回一個指向map尾部的逆向迭代器

rend():  返回一個指向map頭部的逆向迭代器

clera():清除容器中所有元素

empty():判斷容器是否為空

size():返回容器中元素的個數

count(k):返回指定鍵等於k的資料的出現的次數

find(k) :如果m中存在按k索引的元素,則返回指向該元素的迭代器。如果不存在,則返回結束遊標end()

get_allocator():返回map的配置器

swap():交換兩個map容器的元素

erase(k);  // 刪除m中鍵為k的元素,返回size_type型別的值,表示刪除元素的個數。
erase(p);  // 從m中刪除迭代器p所指向的元素,p必須指向m中確實存在的元素,而且不能等於m.end(),返回void型別。

erase(iterator first, iterator last);  // 刪除一個範圍,返回void型別。

4.multimap

multimap中的鍵也是按照建構函式中所指定的二元謂詞進行排序的。 
multimap的元素型別和map是一致的,這裡就不再贅述。 
這裡就簡要概述一下multimap和map不同的地方:multimap中相同的鍵可以多次出現,而不像map只能出現一次。 在multimap中沒有定義[]運算子,當然也沒有定義at()成員函式,因此,multimap進行插入的時候,只能利用insert()函式進行插入。 

訪問一個鍵的區間的三種方式
(1)通過其實點和數量來訪問,即find(k)和count(k) 
multimap<string,int>::iterator it;
int num=m.count("Jack");
it = m.find("Jack");
cout<<"the search result is :"<<endl;
for(int i=1;i<=num;i++)
 {
        cout<<(*it).first<<"  "<<(*it).second<<endl;
it++;
}
(2)通過起始點和結束點,即lowerbound()和upper_bound()


(3)equal_range();
pair<iterator,iterator> equal_range(const key_type& k) const;//返回的pair物件, 
                //first為lower_bound(k);大於等於k的第一個元素位置 
                //second為upper_bound();大於k的第一個元素位置  

第一篇:C++的STL容器之順序性容器vector、list、deque

第三篇:C++的STL容器之關聯性容器stack、queue、priority_queue

連結:https://blog.csdn.net/baodream/article/details/79732680

相關推薦

C++的STL容器關聯性容器setmultisetmapmultimap

STL對定義的通用容器分三類:順序性容器、關聯式容器和容器介面卡。順序性容器:vector、list、deque關聯性容器:set、multiset、map、multimap容器介面卡:stack、qu

C++STL模板庫關聯容器set/multiset

目錄 一丶關聯容器簡介.set/multiset 二丶演示程式碼. 一丶關聯容器簡介.set/multiset 我們的序列容器,底層都是線性表構成的. 比如 vector list deque. 關聯容器底層就是紅黑樹. 以set集合為例. set內部元素根據其值自動排序.每個元素的值只允

C++ STL學習五】容器setmultiset

一、set和multiset基礎 set和multiset會根據特定的排序準則,自動將元素進行排序。不同的是後者允許元素重複而前者不允許。 需要包含標頭檔案: #include <set> set和multiset都是定義在std空間裡的類模板: templ

C++STL模板庫序列容器deque

數組 自增 使用 lis names pre define warnings push 目錄 一丶隊列容器deque簡介 二丶使用代碼演示 一丶隊列容器deque簡介 deque底層跟vector一樣,都是數組維護.不同的是可以操作頭部. 二丶使用代碼演示 #defin

C++STL 中的線性容器整體/逐元素操作方法 少寫80%for循環

個數 multipl 頭文件 turn 含義 enc function thead gcd 本文中示例代碼默認已引用 std 命名空間 累加 (std::accumulate) accumulate(begin, end, init, op) 返回給定區間內元素的累加值與給

C++ STL queue 隊列容器 基本方法

隊列大小 bsp 元素 隊列 c++ queue ont emp 入隊 創建隊列 queue<int> que; 讀取隊首元素 que.front(); 讀取隊尾元素 que.back(); 元素入隊 queue.pust(); 元素出隊 qu

C++STL幾種常用容器簡要歸納

本文參考李煜東《演算法競賽進階指南》,筆者作歸納總結。 本文將簡要介紹STL中vector,queue,priority_queue,deque,set,multiset,map,bitset八種容器及其操作方法。 vector 使用此容器需在程式前加上標頭檔

C++STL中常用的容器下標[]運算

在C++STL中常用的容器和型別,下面哪些支援下標"[]"運算? 正確答案: A C D F I   你的答案: B H I (錯誤) vector list deque m

C++ STL/ (10) 階段小結--容器的共性以及使用場景

在前面的blog中,我們介紹了順序容器(string,vector,deque,list,stack,queue)和關聯容器(set,multiset,map,multimap)。本節,我們就來總結一下

C++STL---bitset位集合容器

一、解釋 bitset容器是一個bit位元素的序列容器,每個元素只佔一個bit位,取值為0或1。 方法 功能 b.any() b中是否存在置為1的二進位制位 b.none() b中不存在

C++ STL常用標準庫容器

其中幾種種序列容器型別 C++ STL中最基本以及最常用的類或容器無非就是以下幾個: string vector deque list forward_list queue priority_queue stack string 對比在C語言中一般怎麼使用

C++容器List容器初學

List簡介 ² list是一個雙向連結串列容器,可高效地進行插入刪除元素。 ² list不可以隨機存取元素,所以不支援at.(pos)函式與[]操作符。It++(ok) it+5(err) ² #include <list>   list物件的預設構造 li

STL::array陣列容器

本文是Devour Heavens撰寫整理的關於C++標準庫的知識,所有資料均來自於C++官方文件,歡迎轉載。但是為了尊重原作者的勞動,請註明出處!謝謝!  模板類 array template < class T, size_t N > class array

JAVA並發容器CopyOnWrite容器

最終一致性 使用 當我 .com 比較 響應時間 get 理解 資源 學習資源:http://www.cnblogs.com/dolphin0520/p/3938914.html   CopyOnWrite容器即寫時復制的容器。通俗的理解是當我們往一個容器添加元素的時候,不

【校招面試 C/C++】第20題 C++ STL(二)Vector

小時 可用 修改 ret cap push sta enc 指向 1、vector的動態增長   當添加元素時,如果vector空間大小不足,則會以原大小的兩倍另外配置一塊較大的新空間,然後將原空間內容拷貝過來,在新空間的內容末尾添加元素,並釋放原空間。vector的空間動

C++ STL學習 空間配置器(allocator)

標籤(空格分隔): C++ STL 眾所周知,一般情況下,一個程式包括資料結構和相應的演算法,而資料結構作為儲存資料的組織形式,與記憶體空間有著密切的聯絡. 在C++ STL中,空間配置器便是用來實現記憶體空間(一般是記憶體,也可以是硬碟等空間)分配的工具,他與容器聯絡緊密,每一種容器的空間分配都是通過空

控制反轉容器容器和bean的基本原理)

前言:控制反轉和依賴注入 控制反轉是什麼?是一種設計思想。 控制:IOC容器控制物件,控制外部資源。 反轉:是相對於正轉而言的,正轉就是我們主動去建立物件,而反轉則是我們通過IOC容器被動的建立物件,物件的建立和銷燬都是有IOC容器來控制。相當於控制權不同,之前控制權在

c++ STL學習stack堆疊總結

一、標頭檔案 # include<stack> 二、定義 堆疊是一個線性表,插入和刪除只在表的一端進行。這一端稱為棧頂,另一端稱為棧底。堆疊的元素插入稱為入棧,元素的刪除則為出棧。 堆疊

C++ STL模板queue佇列的用法】

#include <iostream> #include <queue> #include <assert.h> /* 呼叫的時候要有標頭檔案: #incl

c++ STL 學習筆記(pair 和 set)

STL pair (1)pair 的定義 標頭檔案 <utility> STL的標頭檔案中描述了一個看上去非常簡單的模版類pair,用來表示一個二元組或元素對,並提供了按照字典序對元素對進行大小比較運算子模版函式。 定義一個pair物件表示一個平面座標點: 例: