c++之順序容器
阿新 • • 發佈:2021-06-28
目錄
概述
名稱 | 優缺點 |
---|---|
vector | 可變大小陣列。 支援快速隨機訪問。在尾部之外的位置插入或刪除元素可能會很慢。 |
deque | 雙端佇列。支援快速隨機訪問。在頭尾位置插入或刪除很快 |
string | 與vector類似,但是專門用於儲存字元。隨機訪問快,在尾部插入或刪除很快 |
arrary | 固定大小陣列。支援快速隨機訪問。不能新增和刪除元素 |
list | 雙向連結串列。只支援雙向順序訪問。在list中任何位置進行插入或刪除都很快 |
forward_list | 單向連結串列。只支援單向順序訪問。在連結串列任何位置進行插入或刪除都很快 |
通常使用std::vector 是最好的選擇,除非有很好的理由選擇其他容器。
容器幾乎可以存放任意型別的元素,包括容器。
迭代器iterator
迭代器的算術運算只能應用於
string vector deque 和array
容器中,不能用於forward_list
容器中。
迭代器中的begin指向容器首元素的位置, end指向容器尾元素之後的位置。end可以和begin指向相同的位置,但是不能指向begin之前的位置。
while(begin != end)
{
*begin = value;
++begin;
}
end返回的迭代器不指向某個位置,所以不能對其進行遞增和解引用操作。
- 迭代器的型別
std::vector<int>::iterator it; // it能夠讀寫std::vector<int>中的元素
std::vector<int>::const_iterator it2; //it2只能讀元素,不能寫元素
- begin和end
list<string> a = {"Milton", "Shakespeare", "Austen"}; auto it1 = a.begin(); // list<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
注:reverse_iterator是一個反向迭代器,各種操作的含義與iterator相反。
注:遍歷容器時,當不需要修改元素時,應該使用cbegin和cend。
容器定義與初始化
vector<int> ivec(10, -1); // ten int elements, each initialized to -1
list<string> svec(10, "hi!"); // ten strings; each element is "hi!"
forward_list<int> ivec(10); // ten elements, each initialized to 0
deque<string> svec(10); // ten elements, each an empty string
- arrary固定陣列
當定義一個arrary容器時,不僅要指定元素型別,還要制定容器大小。
array<int, 10> ia1; // ten default-initialized ints
array<int, 10> ia2 = {0,1,2,3,4,5,6,7,8,9}; // list initialization
array<int, 10> ia3 = {42}; // ia3[0] is 42, remaining elements are 0
順序容器的操作
- 向順序容器新增元素
注:forward_list有自己專門版本的insert和emplace
注:forward_list不支援push_back和emplace_back
注:vector和string不支援push_front和emplace_front
c.push_back();
c.emplace_back();
c.push_front();
c.emplace_front();
c.insert(p, t);
c.insert(p, n, t); //在迭代器p指向元素之前插入n個值為t的元素。
c.insert(p, b, e); //在迭代器be範圍的元素插入到迭代器p指向元素之前。
- 訪問元素
注:at和下標只適用於vector、string、deque和array
注:back不適用於forward_list
c.back()
c.front()
c[n]
c.at(n)
注:書上說下標訪問不會檢查越界行為(如果容器為空的, 訪問越界會報錯, 但是如果不為空, 方位越界出現不確定值, 不報錯),但是at訪問會的。可是我寫程式時下標訪問也會檢查越界行為的。
- 刪除元素
c.pop_back()
c.pop_front()
c.erase(p)
c.erase(b, e)
c.clear()
- 改變容器的大小
注:resize不適用於arrary
c.resize(n)
c.resize(n, t) //調整容器的大小為n, 新增的元素初始化為t
向容器中新增、刪除元素都會使得指向容器元素的指標、引用和迭代器失效。