C++容器學習

之前自學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的自增加:

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類型

string能夠當作一個特殊的容器,其操做不少與vector容器相似。

但,在string中不支持棧方式的操做,即不能使用front、back和pop_back操做。

固然,string還提供了其餘不少容器所沒有的函數,如append、replace、find、find_first_of、find_first、compare等等。

相關文章
相關標籤/搜索