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