C Primer讀書筆記(八)

2021-05-26 21:12:33 字數 3466 閱讀 2673

stl容器之關聯容器

集和多集(set 和multiset 容器類):

乙個集合(#include)是乙個容器,它其中所包含的元素的值是唯一的。這在收集乙個資料的具體值的時候是有用      的。集合中的元素按一定的順序排列,並被作為集合中的例項。如果你需要乙個鍵/值對(pair)來儲存資料,map(也是乙個      關聯容器,後面將馬上要講到)是乙個更好的選擇。乙個集合通過乙個鍊錶來組織,在插入操作和刪除操作上比向(vector)      快,但查詢或新增末尾的元素時會有些慢。

在集中,所有的成員都是排列好的。

如果先後往乙個集中插入:12,2,3,123,5,65

則輸出該集時為:2,3,5,12,65,123

集和多集的區別是:set支援唯一鍵值,set中的值都是特定的,而且只出現一次;而multiset中可以出現副本鍵,同一值可以出          現多次。

set和multiset的模板引數:

template
第乙個引數key是所儲存的鍵的型別,第二個引數是為排序值而定義的比較函式的型別,第三個引數是被實現的儲存分配符的型別。在有些編譯     器的具體實現中,第三個引數可以省略。第二個引數使用了合適形式的迭代器為鍵定義了特定的關係操作符,並用來在容器中遍歷值時建立順序。     集的迭代器是雙向,同時也是常量的,所以迭代器在使用的時候不能修改元素的值。

set定義了三個建構函式:

預設建構函式:

explicit

set(

const

compare&=compare());  

如:

set<

int,less<

int> > set1; 

less是乙個標準類,用於形成降序排列函式物件。公升序排列是用greater。通過指定某一預先定義的區間來初始化set物件的建構函式:

template

<

class

inputiterator> set(inputiterator, inputiterator,\ 

const

compare&=compare()); 

如:

set<

int,less<

int> >set2(vector1.begin(),vector1.end()); 

複製建構函式:

set(

const

set);  

如:

set<

int,less<

int> >set3(set2);  

下面我們來看乙個簡單的集和多集的插入例程:

#include#include
#include using namespace std;

int main(int argv, char **argc)

for(set::iterator p=set1.begin(); p!=set1.end(); ++p)

couta.insert(set1.begin(),set1.end());

a.insert(a, a+10);

cout<::iterator p=a.begin();p!=a.end();++p)

return 0;
}

對映和多重對映(map 和multimap)

對映和多重對映(#include)基於某一型別key的鍵集的存在,提供對t型別的資料進行快速和高效的檢索。對map而言,鍵只是指儲存在容器中的某一成員。map不支援副本鍵,multimap支援副本鍵。map和multimap物件包涵了鍵和各個鍵有關的值,鍵和值的資料型別是不相同的,這與set不同。

set中的key和value是key型別的,而map中的key和value是乙個pair結構中的兩個分量。map支援下表運算子operator,用訪問普通陣列的方式訪問map,不過下標為map的鍵。在multimap中乙個鍵可以對應多個不同的值。

下面的例程說明了map中鍵與值的關係。

#include#include #include using namespace std;

int main(int argv, char **argc)

//first對應定義中的char鍵,second對應定義中的int值

//檢索對應於d鍵的值是這樣做的:

map>::const_iterator ptr;

ptr = map1.find('d');

cout<<'\n'<<" "<<(*ptr).first<<" 鍵對應於值:"<<(*ptr).second;

return 0;

}

從以上例程中,我們可以看到map物件的行為和一般陣列的行為類似。map允許兩個或多個值使用比較操作符。下面我們再看看multimap:

#include#include #includeusing namespace std;

int main(int argv, char **argc)

{

multimap>mulmap;

multimap>::iterator p;

//初始化多重對映mulmap:

typedef multimap>::value_type vt;

typedef string s;

mulmap.insert(vt(s("tianqi "),s("is a zhu")));

mulmap.insert(vt(s("tianqi" ),s("is a zhupo")));

mulmap.insert(vt(s("tianqi "),s("is a lovely zhupo!")));

mulmap.insert(vt(s("jincheng "),s("is a boy")));

mulmap.insert(vt(s("jincheng "),s("is a handsome boy")));

mulmap.insert(vt(s("tq "),s("is a ***y girl")));

//輸出初始化以後的多重對映mulmap:

for(p=mulmap.begin();p!=mulmap.end();++p)

{ cout<<(*p).first<<(*p).second《在map中是不允許乙個鍵對應多個值的,在multimap中,不支援operator,也就是說不支援map中允許的下標操作。

c primer 讀書筆記八

2.4.4 constexpr和常量表示式 常量表示式是指值不會改變並且在編譯過程就能得到計算結果的表示式,字面值屬於常量表示式,用常量表示式初始化的const物件也是常量表示式 乙個物件是不是常量表示式是由它的資料型別和初始值決定的 const int max files 20 max files...

C primer 讀書筆記

第2 章 變數和基本型別 1 變數直接初始化和變數 複製初始化 int ival 1024 direct initialization int ival 1024 copy initialization 初始化不是賦值 2 內建型別復 制初始化和直接初始化幾乎沒有區別 但 對類型別物件來 說,有些初...

C Primer讀書筆記

前些日子開始看 c primer 順便做一些筆記,既有書上的,也有自己理解的。因為剛學c 不久,筆下難免有謬誤之處,行文更是凌亂 所幸不是用來顯配的東西,發在linuxsir只是為了方便自己閱讀記憶,以防只顧上網忘了正事。書看了不到一半,所以大約才寫了一半,慢慢補充。const要注意的問題 1 下面...