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...