1. 程式人生 > >C++Primer_Chap09_順序容器_List02_容器庫概覽_筆記

C++Primer_Chap09_順序容器_List02_容器庫概覽_筆記

容器操作
類型別名
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的元素