C++Primer_Chap09_順序容器_List02_容器庫概覽_筆記
阿新 • • 發佈:2018-12-15
類型別名 | |
iterator | 此容器型別的迭代器模式 |
const_iterator | 可以讀取元素,但不能修改元素的迭代器型別 |
size_type | 無符號整型型別,足夠儲存此種容器型別最大可能容器的大小 |
difference_type | 帶符號整型型別,足夠儲存兩個迭代器之間的距離 |
value_type | 元素型別 |
reference | 元素的左值型別:與value_type&含義相同 |
const_reference | 元素的const左值型別(即:const value_type&) |
建構函式 | |
C c; | 預設建構函式,構造空容器 |
C c1(c2); |
構造c2的拷貝c1 |
C c(b, e); | 構造c,將迭代器b和e指定範圍內的元素拷貝到c(array不支援) |
C c(a, b, c……); | 列表初始化c |
賦值和swap | |
c1 = c2; |
將c1中的元素替換成c2中的元素 |
c1 = {a, b, c……}; | 將c1中的元素替換成列表中元素(不適用array) |
a.swap(b) | 交換a和b的元素 |
swap( a ,b ) | 等價上行 |
大小 | |
c.size() | c中元素數目(不支援forward_list) |
c.max_size() |
c可儲存最大元素數目 |
c.empty() | 若c中儲存了元素,返回false,否則返回true |
新增/刪除元素(不適用與array) 注:在不同容器中,這些操作的介面不同 |
|
c.insert(args) | 將args中的元素拷貝進c |
c.emplace(inits) | 使用inits構造c中的一個元素 |
c.erase(args) | 刪除args指定的元素 |
c.clear() | 刪除c中所有元素,返回void |
關係運算符 | |
==,!= | 所有容器都支援相等(不等)運算子 |
<, <=,>,>= | 關係運算符(無序關聯容器不支援) |
獲取迭代器 | |
c.begin(), c.end() | 返回指向c的首元素和微元素之後位置的迭代器 |
c.cbegin(),c.cend() | 返回const_interator |
反向容器的額外成員(不支援forward_list) | |
reverse_iterator | 按逆序定址元素的迭代器 |
const_reverse_iterator | 不能修改元素的逆序迭代器 |
c.rbegin(),c.rend() | 返回指向c首元素和尾元素之前位置的迭代器 |
c.crbegin(),c.crend() | 返回const_reverse_iterator |
迭代器範圍
迭代器的元素範圍被稱為左閉合區間,標準數學描述為 [ begin, end)。表示範圍從begin開始,於end之前結束。迭代器begin和end必須指向相同的容器。end可以與begin指向相同的位置,但不能指向begin之前的位置。
- 如果begin與end相等,則範圍為空
- 如果begin與end不等,則範圍至少包含一個元素,且begin指向該範圍中的第一個元素
- 可以對begin遞增若干次,使begin==end
while( begin != end)
{
*begin = val;
begin++;
}
容器型別成員
反向迭代器就是一種反向遍歷容器的迭代器,即對一個反向迭代器執行++操作,會得到上一個元素。
為了使用容器型別,必須顯式使用某類名:
vector<string>::iterator iter;
vector<int>::difference_type count;
begin和end成員
不以c開頭的函式都是被過載過的。實際上有兩個名為begin的成員:
- 一個是const成員,返回容器的const_iterator型別
- 另一個是非常量成員,返回容器的iterator型別。
當我們對一個非常量物件呼叫這些成員時,得到的返回iterator版本。只有對const物件低啊用這些函式時,才會得到一個const版本。與const指標和引用類似,可以將一個普通的iterator轉換成對應的const_iterator,但反之不行
list<string> a = {"Milton", "Shakespeare", "Austen"};
auto it1 = a.begin(); //lis<string>::iterator
auto it2 = a.rbegin(); //list<string>::reverse_iterator
auto it3 = a.cbegin(); //list<string>::const_iterator
auto it4 = a.crbegin(); //list<string>::const_reverse_iterator
list<string>::iterator it5 = a.begin();
list<string>::const_iterator it6 = a.begin();
//是iterator還是const_iterator依賴於a的型別
auto it7 = a.begin(); //僅當a是const時,it7是const_iterator
auto it8 = a.cbegin(); //it8是const_iterator
容器定義和初始化
C c; | 預設建構函式。如果C是一個array,則c中元素按預設方式初始化,否則c為空 |
C c1(c2);
C c1 = c2; |
c1初始化為c2的拷貝。c1和c2必須是相同型別(即,它們必須是相同的容器型別,且儲存的是相同的元素型別;對於array型別,兩者還必須具有相同的大小) |
C c{a,b,c……}; C c = a,b,c……}; |
c初始化為初始化列表中的元素的拷貝。列表中元素的型別必須與C的元素型別相容。對於array型別,列表中的元素數目必須小於等於array的大小,任何遺漏的元素都進行值初始化 |
C c( b, e ); | c初始化為迭代器b和e指定範圍內的元素拷貝。範圍中的元素型別必須與C的元素型別相容(array不適用) |
只有順序容器(不包括array)的建構函式才能接受大小引數 | |
C seq(n); | seq包含n個元素,這些元素進行了值初始化;次建構函式是explicit的(string不適用) |
C seq(n,t); | seq包含n個初始化為值t的元素 |