C primer第五版筆記 第十一章關聯容器

2021-07-05 17:33:33 字數 3409 閱讀 2715

1、 使用關聯容器

map型別通常被稱為關聯陣列,不同之處就是其下標不必是整數。通過關鍵字而不是位置查詢其值。set是關鍵字的簡單集合。

使用map:

//統計每個單詞在輸入中出現的次數

mapword_count;//string到size_t的空map

string word;

while (cin>>word)

for(const auto &w:word_count)//對map中的每個元素

//列印結果

cout<1)?"times":"time")<

//統計每個單詞在輸入中出現的次數

mapword_count;//string到size_t的空map

setexclude=;

string word;

while (cin>>word)

初始化multimap和multiset

他們允許多個元素具有相同的關鍵字。

2、關聯容器概述

定義乙個map時,必須指明關鍵字型別又指明值型別,而定義乙個set時候,只需要指明關鍵字型別

當初始化乙個map時,必須提供關鍵字型別和值型別。我們將每個關鍵字和值包圍在花括號中:

//定義乙個又20個元素的vector,儲存0-9每個整數的兩個拷貝

vectorivec;

for(vector::size_type i = 0; i != 10;++i)

//iset包含來自ivec的不重複元素,miset包含所有20個元素

setiset(ivec.cbegin(),ivec.cend());

multisetmiset(ivec.cbegin(),ivec.cend());

cout<

關鍵字型別的要求

bool copareisbn(const sales_data &lhs,const sales_data &rhs);//列表初始化

else

return pair();//隱式建構函式

}

若v不為空,我們返回乙個由v中最後乙個string及其大小組成的pair,否則返回乙個空的pair。並返回它。

3、關聯容器操作

key_type  此容器型別的關鍵字型別

value_type 對於set,與key_type相同

set::value_type v1;//v1是乙個string

set::key_type v2;//v2是乙個string

map::value_type v3;//v3是乙個pairmap::key_type v4;//v4是乙個string

關聯容器迭代器

//獲得指向word_count中乙個元素的迭代器

auto map_it = word_count.begin();

//*map_it 是指向乙個pair物件的引用

cout cout << " "map->it->first="new key";

++map_it->second;//正確,我們可以通過迭代器改變元素

//set的迭代器是const

setiset =;

set::iterator set_it = iset.begin();

if(set_it != iset.end());//ivec又8個元素

setset2;//空集合

set2.insert(ivec.cbegin(),ivec.cend());//set2有4個元素

set2.insert();

//向map新增元素

//向word_count插入word的4種方法

word_count.insert();

word_count.insert(make_pair(word,1));

word.count.insert(pair(word,1));

word.count.insert(map::value_type(word,1));

//統計每個單詞在輸入中出現的次數的一種比較繁瑣的辦法

mapword_count;//從string到size_t的空map

string word;

while (cin>>word) );

if(!ret.second)

++ret.first->second;

}

map的下標操作

mapword_count;

//插入乙個關鍵字「anna」,關聯值進行初始化,然後將1賦予它

word_count["anna"]=1

在word_count中搜尋關鍵字為anna的元素,未找到

將乙個新的關鍵字-值對插入到word_count中。關鍵字是乙個const string。儲存anna。值進行初始化。本例中為0

提取新插入的元素,並將它賦值為1

c[k]:返回關鍵字為k的元素,如果關鍵字k不在c中,新增乙個關鍵字為k的元素,對其進行值初始化

c.at[k] 訪問關鍵字為k的元素,帶引數檢查,若k不在c中,丟擲異常

訪問元素

setiset=;

iset.find(1);//返回乙個迭代器

iset.find(11);//返回乙個迭代器,其值等於iset.cend()

iset.count(1);//返回1

iset.count(11);//返回0

c.lower_bound(k)  返回乙個迭代器,指向乙個關鍵字不小於k的元素

c.upper_bound(k)  返回乙個迭代器,指向關鍵字大於k的、元素

c.equal_range(k) 返回乙個迭代器pair,表示關鍵字等於k的元素的範圍,若k不錯,pair的兩個成員軍等於c.end()

在multimap和multyiset中查詢元素

string search_item("anna");

auto entries = authors.count(search_item);

auto iter = authors.find(search_item);//

//用乙個迴圈查詢此作者的所有著作

while (entries)

else

throw runtime_error("no rule for "+key);

}return trans_map;

}

生成轉換文字

const string & transform(const string &s,const ap&m)

4、無序容器

C Primer第五版筆記 關聯容器

一 型別 關聯容器支援高效的關鍵字查詢和訪問,標準庫中兩個主要的關聯容器是map和set。map中的元素是鍵值對關鍵字表示索引。set中每個元素只包含乙個關鍵字,set支援高效的關鍵字查詢。關聯容器根據三個特性可以分為8種 1 set還是map 2 關鍵字是否可以重複,允許重複的容器名字中都包含單詞...

C Primer第五版筆記 動態陣列

allocator類 為了讓new分配乙個物件陣列,需要在型別名後跟方括號,括號中是分配物件的數目,該數目必須是整型,但不必是常量 new t 分配的記憶體並不是得到乙個陣列,而是得到乙個陣列元素型別的指標,因此不能對動態陣列呼叫begin和end 與普通陣列不同的是,普通陣列不能定義長度為0的陣列...

C Primer第五版筆記 拷貝控制

拷貝賦值函式 析構函式 三 五法則 default和阻止拷貝 乙個類通過定義五種特殊的成員函式來控制其拷貝 賦值 移動以及銷毀操作 拷貝建構函式 拷貝賦值運算子 移動建構函式 移動賦值運算子和析構函式。這些操作都是拷貝控制操作。當實現自己的類的時候要想好在做這些操作時的規則,因為編譯器通常會自動生成...