c/c++stl常用容器用法總結
一、容器
概念:容器是儲存其他物件的物件。被儲存的物件必須是同一型別。
基本特徵:以下用x表示容器型別(後面會講到),t表示儲存的物件型別(如int);a和b表示為型別x的值;u表示為乙個x容器的識別符號(如果x表示vector,則u是乙個vector物件。)
表 達 式
返 回 類 型
說 明復 雜 度
x::iterator
指向t的迭代器型別
滿足正向迭代器要求的任何迭代器
編譯時間
x u建立乙個名為u的空容器
固定x ()
建立乙個匿名空容器
固定x u(a)
同x u(a);
線性a.begin()
迭代器返回指向容器第乙個元素的迭代器
固定a.end()
迭代器返回指向超尾值的迭代器
固定a.size()
無符號整型
返回元素個數
固定a.swap()
void
交換a和b內容
固定a == b
可轉換為bool
如果a和b長度相當且每個元素都相等,則為真
線性a != b
可轉換為bool
返回!(a == b)
線性二、序列容器
常用容器:vector、deque、list、queue、stack
概念:序列是對基本容器的一種改進,在保持其基礎功能上增加一些我們需要的更為方便的功能。
要求:序列的元素必須是嚴格的線性順序排序。因此序列中的元素具有確定的順序,可以執行將值插入到特定位置、刪除特定區間等操作。
序列容器基本特徵:以下用t表示型別為t(儲存在容器中的值的型別)的值,n表示整數,p、q、i和j表示迭代器。
表 達 式
返 回 類 型
說 明x a(n,t)
宣告乙個名為a的由n個t值組成的序列
x(n,t)
建立乙個由n個t值組成的匿名序列
x a(i,j)
宣告乙個名為a的序列,並將其初始化為區間[i,j)的內容
x(i,j)
建立乙個匿名序列,並將其初始化為區間[i,j)的內容
a.insert(p,t)
迭代器將t插入到p的前面
a.insert(p,n,t)
void
將n個t插入到p的前面
a.insert(p,i,j)
void
將區間[i,j)的元素插入到p前面
a.erase(p)
迭代器刪除p所指向的元素
a.erase(p,q)
迭代器刪除區間[p,q)中的元素
a.clear()
void
清空容器
不同容器特有的特徵:
表 達 式
返 回 類 型
含 義支 持 的 容 器
a.front()
vector、list、deque
a.back()
vector、list、deque
a.push_front(t)
list、deque
a.push_back(t)
vector、list、deque
a.pop_front(t)
list、deque
a.pop_back(t)
vector、list、deque
a[n]
vector、deque
a.at(t)
vector、deque
*a[n]和a.at(n)都返回乙個指向容器中第n個元素的引用。區別在於:如果n落在容器有效區間之外,a.at(n)將執行邊界檢查,並引發out_of_range異常。
*之所以vector沒有push_front(),是因為vector執行此表示式複雜度為線性時間,而deque為固定時間。(這與它們的特性有關,下面講到)
(一)vector
vector是最簡單也是最重要的乙個容器。其標頭檔案為.
vector是陣列的一種類表示,它有以下優點:自動管理記憶體、動態改變長度並隨著元素的增減而增大或縮小。
在尾部新增元素是固定時間,在頭部或中間新增或刪除元素是線性時間。
vector是可反轉容器。下面以vector為例介紹可反轉容器。
(待補充)
(二)deque
標頭檔案在stl中deque類似vector,並且支援隨機訪問。區別在於:從deque起始位置插入刪除元素時間是固定的。
為了實現在deque倆段執行插入和刪除操作的時間為固定這一目的,deque物件設計比vector設計更為複雜一些。因此,在序列中部執行插入刪除操作時,vector更快一些。
(三)list
函 數說 明
void merge(list& x)
將鍊錶x與呼叫鍊錶合併,倆個鍊錶必須已排序。合併後的經過排序的鍊錶儲存在呼叫鍊錶中,x為空。線性時間。
void remove(const t & val)
從鍊錶中刪除val的所有例項。線性時間。
void sort()
使用《運算子對鍊錶進行排序,複雜度nlogn
void splice(iterator pos,listx)
將鍊錶x的類容插入到pos前面,x將為空。固定時間。
void unique()
將連續相同的元素壓縮為單個元素。線性時間。
放入**中:
#include
#include
#include
#include
using namespace std;
void outint(int n)
void show(listdice,int flag)//此函式用來輸出容器元素
int main()
;dice.insert(dice.begin(),a,a+4);//insert函式用法
show(dice,1);
listtwo(dice);//另一種賦初值方法,其值與dice相等
show(two,0);
dice.splice(dice.begin(),two);//splice函式用法
show(dice,1);
show(two,0); //two清空
two = dice;
dice.unique();//unique壓縮連續相同的元素
show(dice,1);
dice.sort();//sort函式用法
two.sort();
show(dice,1);
show(two,0);
dice.merge(two);//merge函式用法,將two合併到dice中,two將為空。
show(dice,1);
show(two,0);
dice.remove(2);//移除所有2
show(dice,1);
return 0;
}insert()與splice()之間的不同主要在與:insert()將原始區間的副本插入到目標位址,而splice()則將原始區間移到目標位址。splice()執行後,迭代器仍有效。也就是說原本指向two中乙個元素的迭代器,在使用過splice後仍然指向它。
remove()函式還有更加方便的拓展,將在以後講到。
(四)queue
標頭檔案queue不允許隨機訪問佇列元素,不允許遍歷佇列,可以進行佇列基本操作
可以將元素新增到隊尾,從隊首刪除元素,檢視隊尾和隊首的值,檢查元素數目和測試佇列是否為空
queue的操作:
方 法 說 明
bool empty()const 如果隊列為空,則返回true,否則返回false
size_type size()const 返回佇列中元素的數目
t& front() 返回指向隊首元素的引用
t& back() 返回指向隊尾元素的引用
void push(const t& x) 在隊尾插入x
void pop() 刪除隊首元素
pop()是乙個刪除資料的方法,不是檢索資料的方法。如果要使用佇列中的值,首先要使用front()來檢索這個值,然後用pop()將他從佇列中刪除。
(五)stack
標頭檔案stack是乙個介面卡,它給底層類(預設vector)提供典型棧介面。
stack不允許隨機訪問棧元素,不允許遍歷棧,把使用限制在定義棧的基本操作上
可以將值壓入棧頂,從棧頂彈出元素,檢視棧頂的值,檢查元素數目,測試棧是否為空
stack的操作:
方 法 說 明
bool empty()const 如果棧為空,返回true,否則返回false
size_type size()const 返回棧中元素數目
t& top() 返回指向棧頂元素的引用
void push(const t& x) 在棧頂插入x
void pop() 刪除棧頂元素
與queue類似,如果要使用棧中的值,必須首先使用top()來檢索這個值,然後使用pop()將它從棧頂刪除。
序列容器還有forword_list(c++11)、priority_queue、array,有興趣的可以去看一看,但我覺的用的不太常用,不打算整理出來了。
三、關聯容器
內容太多了,為了美觀以及方便檢視不得不另起一篇。
關聯容器(map與set)詳解
C 常用容器用法總結
概念 容器是儲存其他物件的物件。被儲存的物件必須是同型別。基本特徵 以下用x表示容器型別,t表示儲存的物件型別 如int a和b表示為型別x的值 u表示為乙個x容器的識別符號 如果x表示vector,則u是乙個vector物件。表示式返回型別說明複雜度 x iterator 指向t的迭代器型別 滿足...
vector容器用法
1 標頭檔案 include.2 建立vector物件,vector vec 3 尾部插入數字 vec.push back a 4 使用下標訪問元素,cout vector iterator it for it vec.begin it vec.end it cout it 6 插入元素 vec.i...
STL Vector容器用法
以類模板形式封裝的資料結構,用於儲存資料。標頭檔案 include vector是c 標準模板庫中的部分內容,它是乙個多功能的,能夠操作多種資料結構和演算法的模板類和函式庫。vector之所以被認為是乙個容器,是因為它能夠像容器一樣存放各種型別的物件,簡單地說,vector是乙個能夠存放任意型別的動...