C++ primer 讀書筆記 9.2 容器庫概覽
阿新 • • 發佈:2018-12-08
模板類
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
定義和初始化
將一個容器建立為另一個容器的拷貝有兩種方法
- 直接拷貝整個容器(要求兩個容器的容器型別和元素型別都匹配)
- 拷貝由迭代器對指定範圍內的元素(只要求元素可以轉換就可以了)
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
容器關係運算
只有相同型別的容器才能進行比較操作