之前自學C++的時候就沒怎麼看容器,一直以來也沒怎麼編過C++程序,如今想用C++寫點東西,突感容器類型有些生疏,故作此筆記。(參考《C++ primer》app
容器:容納特定類型對象的集合。(定義很重要)函數
順序容器:將單一元素彙集起來,根據位置來存儲和訪問元素。spa
標準庫定義了三種容器:vector、list、deque指針
順序容器適配器:stack、queue、priority_queue對象
順序容器 | |
vector | 支持快速隨機訪問 |
list | 支持快速插入、刪除 |
deque | 雙端隊列 |
適配器 | |
stack | LIFO |
queue | FIFO |
priority_queue | 有優先級管理的隊列 |
C<T> c; 初始化一個空的容器隊列
C c(c2); 用已有容器初始化,要求c2類型與C的類型要相同ci
C c(b,e); 用迭代器範圍或指針初始化,b,e指代對象的類型可與C不一樣string
C c(n,t); 新容器有n個元素,每一個初始化爲t。(只適用於順序容器,並要求元素類提供一個參數的構造函數)it
C c(n); 新容器有n個元素(只適用於順序容器,須要提供默認構造函數)io
容器內元素的類型約束:1)、必須支持賦值運算;2)、必須能夠複製;
指定容器的容器時:vector< vector<string> > lines; 要注意留空格;
形如:vector<int>::iterator iter; //iter 至關於指針
*iter | iter所指向元素的引用 |
iter->mem | 解引用,獲取指定元素中名爲mem的成員 |
++iter、iter++或-- | 自加減 |
==、!= | |
關係操做符 | 只適用於vector、deque |
+、-、+=、-=等算術運算 | 只適用於vector、deque |
注意:list的迭代器既不支持自述運算也不支持關係運算,它只提供前置和後置的自增、自減運算及相等、不等運算。
c.push_back(t) | 在末尾添加t |
c.push_front(t) | 在首部添加t,只適用於list和deque |
c.insert(p,t) | 在迭代器p前面搬遷 t,返回新加元素的迭代器 |
c.insert(p,n,t) | 在p前插入n個t,返回void |
c.insert(p,b,e) | 在p前插入b,b指代的範圍內元素,返回void |
注意:任何insert和push操做均可能致使迭代器失效,當編寫循環將元素插入到vector或deque中時,程序必須確保迭代器在每次循環後都獲得更新。因此不要存儲end操做返回的迭代器。
c.size() | |
c.max_size() | |
c.empty() | |
c.resize(n) | 調整大小,填0或刪除多餘元素 |
c.resize(n,t) | 調整大小,新元素賦值t |
c.back() | 返回最後一個元素的引用 |
c.front() | 第一個元素的引用 |
c[n] | 下標訪問。只適用於vector和deque |
c.at(n) | 返回下標。若是下標無效會拋出異常。一樣只適用於vector和deque |
c.erase(p) | 刪除迭代器p處元素,返回指向後一元素的迭代器 |
c.erase(b,e) | 刪除迭代器標記的範圍的全部元素 |
c.clear() | |
c.pop_back() | 刪除最後一個元素 |
c.pop_front() | 刪除第一個元素,只適用於list或deque |
c1=c2 |
|
c1.swap(c2) | 交換內容(原迭代器不會失效) |
c.assign(b,e) | |
c.assign(n,t) | c從新設置爲n個t值元素 |
vector每次調整容量爲增長至當前容量的3/2。
vector、deque:存儲空間連續,對元素能夠快速隨機訪問,vector在尾部插入刪除很快速,但在其餘位置插刪效率較低,deque與vector相似,但在首尾的插刪都很快速。
list:用鏈表組織元素,因此不支持隨機訪問,但在任意位置插刪開銷較小。
注意:編寫代碼時嘗試只使用vector和list容器都能提供的操做,使用迭代器,而不是使用下標,並避免隨機訪問元素。這樣在必要時,可很方便地將程序從使用vector容器修改成使用list容器。
stack棧能夠創建在vector、list或deque容器之上;
queue要求其基礎容器提供push_front運算,所以只能創建在list容器上;
priority_queue要求提供隨機訪問功能,所以可創建在vector、deque上。
支持查詢是否爲empty(),以及大小size(),還有pop():刪除棧頂;top():返回棧頂元素;push():壓入新元素
隊列:FIFO
優先級隊列:將新元素根據優先級,放在比新元素優先級低的元素的前面。
支持的函數:empty(); size(); pop(); front():返回隊首元素,只適用於隊列;back():返回隊尾元素,只適用於隊列;top():返回最高優先級元素值,只適用於優先級隊列;push();
string能夠當作一個特殊的容器,其操做不少與vector容器相似。
但,在string中不支持棧方式的操做,即不能使用front、back和pop_back操做。
固然,string還提供了其餘不少容器所沒有的函數,如append、replace、find、find_first_of、find_first、compare等等。