1. 程式人生 > 其它 >c++之順序容器

c++之順序容器

目錄

概述

名稱 優缺點
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

向容器中新增、刪除元素都會使得指向容器元素的指標、引用和迭代器失效。