所有容器類都有共享公共的接口拣技,不同容器按照不同方式對其進行擴展偏形。每種容器都提供了不同性能和功能的權(quán)衡
順序容器:在添加和刪除元素敏储、隨機訪問元素之間做出折中谎柄。關(guān)鍵是連續(xù)儲存還是非連續(xù)儲存
vecotr // 可變大小數(shù)組丁侄,支持隨機訪問,尾部操作
deque // 雙端隊列朝巫, 支持隨機訪問鸿摇,頭部、尾部操作
list // 雙向鏈表劈猿,只有雙向順序訪問拙吉,可在任何位置操作
forward_list //單向鏈表,只有單向順序訪問糙臼, 可在任何位置操作
array //同數(shù)組庐镐,不過更安全
string // 字符串
deque
定義在頭文件<deque>
,其他容器变逃,同有對所有容器都適用的操作必逆,但是這些操作可能對數(shù)據(jù)類型有要求
vector<noDefault> v1(10, init) //正確: 提供了元素初始值
vector<noDefault> v1(10) //error : 沒有默認構(gòu)造函數(shù)
所有容器都有的操作
- 迭代器
//每個容器都定義了多個類型,如
vector<int>::iterator it;
vector<int>::reverse_iterator r_it;
vector<int>::const_iterator c_it;
vector<int>::size_type s;
vector<int>::differance_type d; //還有 value reference const_reference
//獲得迭代器
auto it1 = a.begin();
auto it2 = a.rbegin(); //反向迭代器
auto it3 = a.cbegin();
auto it4 = a.crbegin();
- 容器定義和初始化
C c; //默認構(gòu)造函數(shù)
C c1(c2);
C c1 = c2; //c1初始化為c2的拷貝揽乱, 元素類型相同
C c{a, b, c}
C c = {a, b, c} //c初始化為初始化列表中元素的拷貝名眉, 元素類型相容即可
C c(b, e); //c初始化為迭代器b和c之間元素的拷貝,左閉右開凰棉。 元素類型相容即可(array不適用)
// list<int>的迭代器可以初始化vector<double>等
//只有順序容器(不包括array)的構(gòu)造函數(shù)才能接受大小參數(shù)
C seq(n) //包含n個元素损拢, string不適用
C seq(n, t); //seq包含n個初始化為值t的元素
array<int, 10> a = {1, 2};
同時指定元素類型和大小。運行拷貝和賦值撒犀,數(shù)組則不行可以通過迭代器初始化
vector<double>
福压,用list<int>
賦值操作:會使得左邊容器內(nèi)部的迭代器掏秩、引用和指針失效。
swap
不會(string和array
除外)
c1 = c2;
c = {a, b, c} //array不適用
swap(c1, c2) //比拷貝快
c1.swap(c2)
//assign操作不適用于關(guān)聯(lián)容器和array荆姆。 很像初始化
seq.assign(b, e) //迭代器
seq.assign(il) //初始化為列表il中的元素
seq.assign(n, t) //n個值為t的元素
-
forward_list
是單鏈表蒙幻,操作有所不同
fl.before_begin()
fl.insert_after()
fl.erase_after()
emplace_after(p, args)
- 改變?nèi)萜鞔笮?/li>
list<int> a(10, 42); //10個int,每個值都是42
a.resize(15); //后面5個是0
a.resize(25, -1); //加上10個-1
a.resize(5); //刪除后面的20個元素
容器操作可能使迭代器失效胆筒。使用失效的迭代器邮破、引用或指針是嚴重的運行時錯誤。添加元素一般保證插入位置之前的元素及其地址不變(順序存儲的情況)仆救,后面的則要平移抒和,地址改變。(把迭代器當(dāng)作指針來看)后面的迭代器對應(yīng)的對象變化了彤蔽。如果添加元素后摧莽,需要重新分配,則前后的迭代器都失效了铆惑。鏈式存儲的情況也可以這么分析
vector
的容量關(guān)聯(lián)
// 初始化之后范嘱,一個一個元素添加。當(dāng)個數(shù)大于容量時员魏,重新分配內(nèi)存丑蛤,一般*2
c.reserve(n) //明確告訴分配至少n個元素的空間
c.capacity() //容量,一般大于實際的元素數(shù)量
c.shrink_to_fit() //把容量減少為元素
的個數(shù)
string
增加了許多可以用下標代替迭代器的操作撕阎,及string
和C風(fēng)格字符數(shù)組之間的相互轉(zhuǎn)換容器適配器:
stack
受裹、quque
和priority_queue
stack
默認基于deque
,可以基于list
或vector
虏束。s.pop()
刪除棧頂元素棉饶,但不返回
queue
默認基于deque
,可以基于list
或vector
镇匀。q.pop()
返回但不刪除
priority_queue
默認基于vector
照藻,可以基于list
。p_q.pop()
返回但不刪除
stack<int> s(deq); //從deq拷貝元素
stack<string, vector<string>> s_v; //基于vector
stack<string, vector<string>> s_v(v); //基于vector汗侵,從v中拷貝元素