以前自學C++的時候就沒怎麼看容器,一直以來也沒怎麼編過C++程序,現在想用C++寫點東西,突感容器類型有些生疏,故做此筆記。(參考《C++ primer》
容器:容納特定類型對象的集合。(定義很重要)
順序容器:將單一元素聚集起來,根據位置來存儲和訪問元素。
標准庫定義了三種容器:vector、list、deque
順序容器適配器:stack、queue、priority_queue
順序容器 vector 支持快速隨機訪問 list 支持快速插入、刪除 deque 雙端隊列 適配器 stack LIFO queue FIFO priority_queue 有優先級管理的隊列C<T> c; 初始化一個空的容器
C c(c2); 用已有容器初始化,要求c2類型與C的類型要相同
C c(b,e); 用迭代器范圍或指針初始化,b,e指代對象的類型可與C不同
C c(n,t); 新容器有n個元素,每個初始化為t。(只適用於順序容器,並要求元素類提供一個參數的構造函數)
C c(n); 新容器有n個元素(只適用於順序容器,需要提供默認構造函數)
容器內元素的類型約束:1)、必須支持賦值運算;2)、必須可以復制;
指定容器的容器時:vector< vector<string> > lines; 要注意留空格;
形如:vector<int>::iterator iter; //iter 相當於指針
*iter iter所指向元素的引用 iter->mem 解引用,獲取指定元素中名為mem的成員 ++iter、iter++或-- 自加減 ==、!= 關系操作符 只適用於vector、deque +、-、+=、-=等算術運算 只適用於vector、deque注意:list的迭代器既不支持自述運算也不支持關系運算,它只提供前置和後置的自增、自減運算及相等、不等運算。
注意:任何insert和push操作都可能導致迭代器失效,當編寫循環將元素插入到vector或deque中時,程序必須確保迭代器在每次循環後都得到更新。所以不要存儲end操作返回的迭代器。
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等等。