1. 程式人生 > >C++ primer 讀書筆記 9.2 容器庫概覽

C++ primer 讀書筆記 9.2 容器庫概覽

模板類

list<int>  
deque<double>

也可以定義容器的容器,

vector<string>  
vector<vector<string>>

迭代器

迭代器範圍 [begin, end)

end指向尾後元素,begin可以通過遞增到達end

這種範圍的約定使得我們能簡單安全的遍歷容器

while( begin != end )
{
    cout << *begin << endl;
    ++begin;
}

連額外的判空操作都不需要了,若begin == end,則範圍為空,迴圈不會執行

begin和end函式

  • begin返回起始迭代器
  • cbegin 返回const迭代器
  • rbegin 返回反向迭代器

容器中實際有兩個名為begin的函式

  • 一個是const成員,返回容器的const_iterator
  • 一個是非const成員,返回容器的iterator
iterator begin();
const_iterator begin() const;

因此下面的型別判斷

auto itr = a.begin();

僅當a是const時,itr是const_iterator

定義和初始化

將一個容器建立為另一個容器的拷貝有兩種方法

  1. 直接拷貝整個容器(要求兩個容器的容器型別和元素型別都匹配)
  2. 拷貝由迭代器對指定範圍內的元素(只要求元素可以轉換就可以了)
C c1(c2);
C c1 = c2;

C c( beg, end );

列表初始化

list<string> authors = {"a", "b", "c"};
vector<const char*> articles = {"a", "b", "c"};

順序容器特有的建構函式

接受一個容器大小和初始值(可選)

vector<int> ivec(10, -1);
list<string> svec(10, "hi");
forward_list<int> ivec (10);

array不支援這種方式

array的構造

與內建陣列一樣,容器大小是array型別的一部分

array<int, 42> arr;
array<int, 42>::size_type i;
array<int, 10> ia1;
array<int, 10> ia2 = {0,1,2,3,4,5,6,7,8,9};
array<int, 10> ia3 = {42};

與內建陣列不同的是,array支援拷貝和賦值

賦值和swap

c1 = c2;

賦值後,c1中元素的個數和值都與c2中相同

賦值完成後,兩個容器之間有關聯嗎?

對於array來說,長度是型別的一部分,要求型別一致才能賦值

array<int, 10> a1 = {0,1,2,3,4,5,6,7,8,9};
array<int, 10> a2 = {0};
a1 = a2;

array<int, 10> a2 = {0};
a2 = {0};

是非法的。array不接受列表賦值

這裡也體現出初始化和賦值是兩碼事

  • 初始化呼叫的是建構函式
  • 賦值呼叫的運算子過載函式

assign

順序容器還定義了名為assign的成員

  • seq.assign(beg, end) 將迭代器範圍內的元素賦值給容器
  • seq.assign(il) 將初始化列表中的元素賦值給容器
  • seq.assign(n,t) 將容器中的元素替換為n個值為t的元素

array也不支援assign

swap

如果兩個容器型別相同,可以用swap交換他們的內容

而且swap比賦值和assign這種元素拷貝操作要快的多,因為它只改變容器的資料結構

----------itr1-----------  
-----------↓-------------  
svec1→{A0, A1, A2,A3}  
svec2→{B0, B1, B2, B3, B4}

swap後

----------itr1-----------  
-----------↓-------------  
svec2→{A0, A1, A2,A3}  
svec1→{B0, B1, B2, B3, B4}

swap只是容器的結構發生了改變,之前的迭代器等指向的元素不發生變化。只是元素屬於另外一個容器了

string是一個例外,呼叫swap會導致迭代器、引用和指標失效

array更加特殊,它的swap是真正的元素交換

----------itr1-----------  
-----------↓-------------  
arr1→{A0, A1, A2,A3}  
arr2→{B0, B1, B2, B3, B4}

swap後

arr1→{B0, B1, B2, B3, B4}  
arr2→{A0, A1, A2,A3}
-----------↑------------- 
----------itr1-----------

容器大小操作

size
empty
max_size

容器關係運算

只有相同型別的容器才能進行比較操作