STL之順序容器
順序容器包括以下幾類:
1、vector
可變大小陣列,可以理解為廣義的動態陣列,如:typename *a = new typename [N] 。因為,陣列是一組連續的儲存單元,所以可以通過陣列首地址+index來訪問其中元素,也即使支援快速隨機訪問。在尾部之外的位置插入或者刪除元素可能會很慢。 這是因為,插入或者刪除都需要移動插入/刪除位置之後的元素。
· vector是不支援push_front(),pop_front()操作的,原因可參考為什麼vector沒有push_front()和pop_front()操作?,但是同樣可以實現pop_front(),如下:
vector<int> a; a.push_back(1); a.push_back(2); a.erase(a.begin()); //返回下個一個元素的迭代器
2、string
跟vector類似,但是是專門用來儲存字元的陣列。可快速隨機訪問。
3、array
跟內建陣列一樣,有固定大小,宣告的時候需要說明大小、型別。如:array <typename,type_size> a;既然跟內建陣列一樣,那自然不支援刪除或者插入。但可以快速隨機訪問。
4、deque
double-end queue(雙端佇列),就是支援隊首和隊尾刪除插入的佇列。支援快速隨機訪問。
5、list
雙向連結串列,跟單向連結串列的區別在於,雙向連結串列可以雙向順序訪問。
6、forward_list
單向連結串列,只支援單向順序訪問。
順序容器的共性:
1)都是線性的、順序的,這中順序跟元素的值沒關係,跟元素加入容器時的位置相對應。
2)都能支援大部分操作
順序容器操作歸類:
1、類型別名
iterator 迭代器
size_tpye 無符號整數型別
differecne_type 有符號整形,儲存兩個迭代器直間的距離
2、建構函式
C c; 預設建構函式,構造空容器
C c1(c2); 呼叫拷貝建構函式,構造C1
C c(beg,end); 將迭代器指定的範圍[beg,end)的元素拷貝到c中,array不支援
C c(num,data); //用Num個data初始化
C c{a,b,c...} ; 用初始化列表(C++11)
3、賦值
c1 = c2;
c1 = {a,b,c..};
swap(a,b) 等價於 a.swap(b);
4、更改容器內容
insert(); //插入
push_back(); //尾部插入
pop_back(); //尾部刪除
erase(); //刪除指定位置的元素
emplace(); //替換,是erase()和Insert()的結合
clear(); //清空
5、獲取迭代器
begin(); //第一個元素的迭代器
end(); //最後一個元素的下一個位置的迭代器
rbegin(); redn(); //反向迭代器
6、獲得元素
at(); //只有使用連續記憶體的才可以用at,如vector,string,deque,array
*iterator; //對有效的迭代器解引用
back(); //尾部元素
front(); //第一個元素
7、容量
resever(); //預先分配記憶體,不會減小已有的容量
capacity(); //獲得當前容量
size(); //當前元素個數
shrink_to_fit(); //根據size()調整容量