關聯容器(map set)(一)

2021-08-15 02:34:39 字數 1640 閱讀 2841

1、關聯容器和順序容器的區別:

順序容器的元素是「順序」儲存的(鍊錶容器雖然在記憶體中不是連續儲存,但仍然是按順序儲存的),底層的資料結構是陣列和鍊錶,每個元素含有唯一對應的編號,容器的操作就是按照編號來完成的,對於新增刪除元素是比較高效的,但是對於值查詢(find)來說需要遍歷容器,所以效率比較低。

關聯容器(map)的元素按照關鍵字值來儲存的,底層結構為紅黑樹、雜湊表等,對於按關鍵字值查詢元素能高效的執行。

2、關聯容器的基礎概述

a、標準庫定義了8種關聯容器:1)兩大類map(對映型別)、set(集合型別)(預設不允許重複關鍵字、有序儲存);2)是否允許重複關鍵字(multiset、multimap);3)是否有序儲存(unorderedset、unorderedmap);

b、map中的元素是關鍵字-值(key-value)對;map型別通常稱為關聯陣列,其下標為關鍵字,通常用於字典型資料型別(姓名-**之類);set中的元素就是關鍵字,通常用於壞值檢測(銀行失信名單等);

mapname_telephone = , };

setname = ;

c、map、set的定義:還有同型別容器之間的初始化

mapname_tele;//空容器,預設初始化;

mapname_tele=,}

set= //值初始化;

setiset(ivec.begin(),ivec.begin()) //迭代範圍初始

d、關鍵字型別的要求:在有序關聯容器中,關鍵字預設使用「<」運算子來進行比較,因此類似於sale_data之類的無"<"運算子的類型別就不能作為關鍵字型別,除非在尖括號中的元素型別後面新增自定義操作型別(指標-

函式指標型別

)(尖括號中的型別僅僅只是乙個型別,只有在建立容器時才會以建構函式的形式提供真正的比較操作):

boo compareibsn(sale_data &s1,sale_data &s2)

{return s1.isbn()bookstore(compareisbn);

//decltype返回函式型別,所以必須新增*;用compareibsn初始化bookstore,每次向bookstore中新增元素時,通過呼叫compareisbn來為這些元素排序

e、疑問:

1、刪除string中的標點和空格,下面的方法編譯不過,ispunct不能放入泛型演算法中作謂詞?

#include 

#include 

str_testing.erase(   

remove_if ( str_testing.begin(), str_testing.end(), static_cast

<

int(*)(

int)>(&ispunct) ),   

str_testing.end());   

str_testing.erase(   

remove_if ( str_testing.begin(), str_testing.end(), static_cast

<

int(*)(

int)>(&isspace) ),   

str_testing.end());   

關聯容器 map set

map型別通常被稱為關聯陣列,與正常陣列類似,不同之處在於其下標不必是整數。我們通過乙個關鍵字而不是位置來查詢值 鍵值對 與之相對,set就是關鍵字的簡單集合。當只是想知道乙個值是否存在時,set是最有用的。類似順序容器,關聯容器也是模板,為了定義乙個map,我們必須指定關鍵字和值得型別。例 map...

Map Set和List的一些關聯

三種集合的示意圖如下 一 map和set map集合的key具有的特徵是無序不重複,如果將map的所有key集中起來,那麼這些key就組成了乙個set集合,而且事實就是map集合提供了如下方法來返回所有key組成的集合 可以看出keyset 的返回型別就是set型別的。對於map而言只要把所有的ke...

關聯容器(一) set

set介紹 set是stl中一種標準關聯容器 vector,list,string,deque都是序列容器,而set,multiset,map,multimap是標準關聯容器 它底層使用平衡的搜尋樹 紅黑樹實現,插入刪除操作時僅僅需要指標操作節點即可完成,不涉及到記憶體移動和拷貝,所以效率比較高。s...