STL 筆記(一): 順序容器 vector、list、deque
來源:程序員人生 發(fā)布時間:2014-10-10 08:00:00 閱讀次數(shù):2354次
STL 容器類
C++ STL 體現(xiàn)了泛型編程的思想,廣義上分為: 容器 (Container),迭代器 (Iterator),算法 (Algorithm)。容器類可以包含一組相同類型或不同類型的對象,包含相同類型對象時稱為同類容器類,包含不同類型對象時,稱為異類容器類。容器類庫共包含 10 種容器,分為三類:
- 順序容器:向量 (vector)、雙端隊列 (deque)、列表 (list);
- 關(guān)聯(lián)容器:集合 (set)、多重集合 (multiset)、映射 (map)和多重映射 (multimap);
- 容器適配器:棧 (stack)、隊列 (queue)和優(yōu)先隊列 (priority queue);
STL 三種順序容器的特性對比:
- vector 可變數(shù)組,內(nèi)存空間是連續(xù)的,容量不會進行縮減。支持高效隨機存取,即支持[]和at()操作。尾部插入刪除效率高,其他位置插刪效率較低;
- list 雙向鏈表,內(nèi)存空間可不連續(xù),不支持隨機存取。插入和刪除的效率很高;
- deque 雙端隊列,內(nèi)存空間是多個連續(xù)的內(nèi)存塊,在一個映射結(jié)構(gòu)中保存對這些塊以及順序的跟蹤,可利用的內(nèi)存更大,且內(nèi)存大小是可以自動縮減的。支持隨機存取,但是隨機存取性能沒有vector 好。首尾插入效率高,其他位置插刪效率低;
使用注意:
- 對于 vector 和 deque,使用隨機訪問時注意不要越界;
- 對于 vector 的非尾部插入刪除和 deque的非首尾插入刪除,會導致部分元素的移動,這是需要考慮之前正在用的迭代器、指針或索引是否需要調(diào)整;
vector 容器常用函數(shù):
#構(gòu)造:
vector(): #創(chuàng)建一個空vector
vector(int nSize): #創(chuàng)建一個vector,元素個數(shù)為nSize
vector(int nSize,const t& t): #創(chuàng)建一個vector,元素個數(shù)為nSize,且值均為t
vector(const vector&): #復制構(gòu)造函數(shù)
vector(begin,end): #復制[begin,end)區(qū)間內(nèi)另一個數(shù)組的元素到vector中
#增刪:
void push_back(const T& x): #向量尾部增加一個元素X
iterator insert(iterator it,const T& x): #向量中迭代器指向元素前增加一個元素x
iterator insert(iterator it,int n,const T& x): #向量中迭代器指向元素前增加n個相同的元素x
iterator insert(iterator it,const_iterator first,const_iterator last): #向迭代器指向元素前插入另一個相同類型向量的[first,last)間的數(shù)據(jù)
iterator erase(iterator it): #刪除向量中迭代器指向元素
iterator erase(iterator first,iterator last): #刪除向量中[first,last)中元素
void pop_back(): #刪除向量中最后一個元素
void clear(): #清空向量中所有元素
#遍歷:
reference at(int pos): #返回pos位置元素的引用
reference front(): #返回首元素的引用
reference back(): #返回尾元素的引用
iterator begin(): #返回向量頭指針,指向第一個元素
iterator end(): #返回向量尾指針,指向向量最后一個元素的下一個位置
reverse_iterator rbegin(): #反向迭代器,指向最后一個元素
reverse_iterator rend(): #反向迭代器,指向第一個元素之前的位置
#功能:
bool empty() const: #判斷向量是否為空,若為空,則向量中無元素
int size() const: #返回向量中元素的個數(shù)
int capacity() const: #返回當前向量張紅所能容納的最大元素值
int max_size() const: #返回最大可允許的vector元素數(shù)量值
void swap(vector&): #交換兩個同類型向量的數(shù)據(jù)
void assign(int n,const T& x): #設(shè)置向量中第n個元素的值為x
void assign(const_iterator first,const_iterator last): #向量中[first,last)中元素設(shè)置成當前向量元素
list 容器常用函數(shù):
#構(gòu)造:
list<Elem> c: #創(chuàng)建一個空的list
list<Elem> c1(c2): #復制另一個同類型元素的list
list<Elem>c(n): #創(chuàng)建n個元素的list,每個元素值由默認構(gòu)造函數(shù)確定
list<Elem>c(n,elem): #創(chuàng)建n個元素的list,每個元素的值為elem
list<Elem>c(begin,end): #由迭代器創(chuàng)建list,迭代區(qū)間為[begin,end)
#增刪:
void push_back(const T& x): #尾部增加一個元素x
void push_front(const T& x): #首部添加一個元素X
void pop_back(): #刪除容器尾元素,當且僅當容器不為空
void pop_front(): #刪除容器首元素,當且僅當容器不為空
void remove(const T& x): #刪除容器中所有元素值等于x的元素
void clear(): #刪除容器中的所有元素
iterator insert(iterator it, const T& x ): #在迭代器指針it前插入元素x,返回x迭代器指針
void insert(iterator it,size_type n,const T& x): #迭代器指針it前插入n個相同元素x
void insert(iterator it,const_iterator first,const_iteratorlast): #把[first,last)間的元素插入迭代器指針it前
iterator erase(iterator it): #刪除迭代器指針it對應的元素
iterator erase(iterator first,iterator last): #刪除迭代器指針[first,last)間的元素
#遍歷:
iterator begin(): #返回首元素的迭代器指針
iterator end(): #返回尾元素之后位置的迭代器指針
reverse_iterator rbegin(): #返回尾元素的逆向迭代器指針,用于逆向遍歷容器
reverse_iterator rend(): #返回首元素前一個位置的迭代器指針
reference front(): #返回首元素的引用
reference back(): #返回尾元素的引用
#功能:
void sort(): #容器內(nèi)所有元素排序,默認是升序
template<class Pred>void sort(Pred pr): #容器內(nèi)所有元素根據(jù)預斷定函數(shù)pr排序
void swap(list& str): #兩list容器交換功能
void unique(): #容器內(nèi)相鄰元素若有重復的,則僅保留一個
void splice(iterator it,list& li): #隊列合并函數(shù),隊列l(wèi)i所有函數(shù)插入迭代指針it前,x變成空隊列
void splice(iterator it,list& li,iterator first): #隊列l(wèi)i中移走[first,end)間元素插入迭代指針it前
void splice(iterator it,list& li,iterator first,iterator last): #x中移走[first,last)間元素插入迭代器指針it前
void reverse(): #反轉(zhuǎn)容器中元素順序
deque 容器常用函數(shù)
#構(gòu)造
deque(): #創(chuàng)建一個空deque
deque(int nSize): #創(chuàng)建一個deque,元素個數(shù)為nSize
deque(int nSize,const T& t): #創(chuàng)建一個deque,元素個數(shù)為nSize,且值均為t
deque(const deque &): #復制構(gòu)造函數(shù)
#增刪:
void push_front(const T& x): #雙端隊列頭部增加一個元素X
void push_back(const T& x): #雙端隊列尾部增加一個元素x
iterator insert(iterator it,const T& x): #雙端隊列中某一元素前增加一個元素x
void insert(iterator it,int n,const T& x): #雙端隊列中某一元素前增加n個相同的元素x
void insert(iterator it,const_iterator first,const_iteratorlast): #雙端隊列中某一元素前插入另一個相同類型向量的[forst,last)間的數(shù)據(jù)
iterator erase(iterator it): #刪除雙端隊列中的某一個元素
iterator erase(iterator first,iterator last): #刪除雙端隊列中[first,last)中的元素
void pop_front(): #刪除雙端隊列中最前一個元素
void pop_back(): #刪除雙端隊列中最后一個元素
void clear(): #清空雙端隊列中最后一個元素
#遍歷:
reference at(int pos): #返回pos位置元素的引用
reference front(): #返回手元素的引用
reference back(): #返回尾元素的引用
iterator begin(): #返回向量頭指針,指向第一個元素
iterator end(): #返回指向向量中最后一個元素下一個元素的指針(不包含在向量中)
reverse_iterator rbegin(): #反向迭代器,指向最后一個元素
reverse_iterator rend(): #反向迭代器,指向第一個元素的前一個元素
#功能:
bool empty() const: #向量是否為空,若true,則向量中無元素
int size() const: #返回向量中元素的個數(shù)
int max_size() const: #返回最大可允許的雙端對了元素數(shù)量值
void swap(deque&): #交換兩個同類型隊列的數(shù)據(jù)
void assign(int n,const T& x): #向量中第n個元素的值設(shè)置為x
vector 小例子:
關(guān)于 vector 的一個小例子
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
void display(int val){
cout<< val <<' ';
}
int main(){
vector<int> v;
for (int i = 0; i < 10; ++i) {
v.push_back(i);
}
for_each(v.begin(), v.end(), display); // for_each 函數(shù)模版
cout<<"
Use iterator
";
vector<int>::iterator iter;
for(iter = v.begin(); iter != v.end(); ++iter){
cout<< *iter << " ";
}
cout<<"---"<<v.at(9);
cout<<"
This is an two-dimensional array
";
vector< vector<int> > array;
vector<int> line;
for(int i = 0; i < 5; ++i){
array.push_back(line);
for(int j = 0; j < 9; ++j){
array[i].push_back(j);
}
}
for(int i = 0; i < 5; ++i){
for(int j = 0; j < array[i].size(); ++j){
cout<< array[i][j] <<" ";
}
cout<<endl;
}
return 0;
}
/* 結(jié)果:
0 1 2 3 4 5 6 7 8 9
Use iterator
0 1 2 3 4 5 6 7 8 9 ---9
This is an two-dimensional array
0 1 2 3 4 5 6 7 8
0 1 2 3 4 5 6 7 8
0 1 2 3 4 5 6 7 8
0 1 2 3 4 5 6 7 8
0 1 2 3 4 5 6 7 8
*/
【地址:http://blog.csdn.net/thisinnocence/article/details/39579647】
生活不易,碼農(nóng)辛苦
如果您覺得本網(wǎng)站對您的學習有所幫助,可以手機掃描二維碼進行捐贈