STL 容器總結(一)
一、所有容器的共通操作
1、equality(==) 和 inequality(!=) 運算子, 返回 true 或者 false。
2、assignment(=) 運算子,將某個容器複製給另一個容器。
3、empty() 會在容器沒有任何元素的時候返回 true,否則 false。
4、size() 返回目前容器中持有元素的數目。
5、clear() 清除所有元素
二、 每個容器都提供了begin() 、end()、 insert()、 erase() 函式
1、begin() 返回一個 iterator,指向容器的第一個元素。
2、end() 返回一個iterator,指向容器的最後一個元素的下一個位置。
3、insert() 將單一或某個範圍內的元素插入容器內。
4、erase() 將容器內單一或某個範圍內的元素刪除。
三、 順序性容器
vector
1、vector 和 list 是最主要的兩個順序性容器。
2、vector 以一塊連續的記憶體來存放元素,對 vector 進行隨機訪問,比較有效率,vector 內的每個元素都被儲存在距離起始點的固定偏移位置上。如果將元素插入任意位置,而不是末端,那麼效率將很低,因為插入位置右端的每一個元素,都必須被複制一份,然後依次向右移動。同樣道理,刪除 vector 內最後一個元素以外的任意元素,同樣缺乏效率。
list
list 是雙向連結,而非連續記憶體來儲存內容,因此可以執行前進或者後退操作。list 中每個元素包含三個欄位:value、back 指標、front 指標。在 list 的任意位置插入和刪除都頗具效率,因為 list 本身只需設定 back 和 front 指標即可。如果對 list 進行隨機訪問的操作,則效率欠佳,因為每次訪問都必須遍歷介於其中的所有元素。
deque
deque 和 vector 行為比較相似,都以連續記憶體來儲存元素。和 vector 不同的是,deque 對於前端元素的插入和刪除效率更高,末端亦同。如果我們需要在容器前端插入元素,並執行末端的刪除操作,deque 比較理想。(標準庫的 queue 以 deque 作為底部儲存元素)
定義容器的方法
# 產生空的容器:
list<string> slist;
vector<int> ivec;
# 產生特定大小的容器:
list<int> ilist(1024);
vector<string> svec(32 );
# 產生特定大小的容器,並制定初值:
list<int> ilist(10, -11);
vector<string> svec(12, "hello");
# 通過一對iterator產生容器:
int ia[6] = {1, 2, 3, 4, 5, 6};
vector<int> ivec(ia, ia+6);
# 複製容器
list<string> slist(1, "hello");
list<string> slist1(slist);
push_back() 會在末尾插入一個元素
pop_back() 會刪除末尾的最後一個元素
除此之外,list 和 deque (不包括 vector) 還提供了 push_front() 和 pop_front() 。
pop_back() 和 pop_front() 這兩個操作函式並不會返回被刪除的元素值。因此,如果要讀取最前端的元素,使用front() ,讀取末端元素,使用back() 。