顺序容器之vector
最近因為需要,在看C++ primer,哇,感覺這本書真不錯,講的細而且到位,而且大量的練習題,不愧為C++學習的經典書籍。今天看了順序容器方面的內容,現在匯報一下:
一、什么是vector
vector是C++標準模板庫(STL)提供的一個容器,說容器可能有點抽象。簡單點吧,學習C++我們都知道C++引入的一個最大的編程上的變化就是加入了面向對象的編程技術,表現在代碼的編寫上也就是增加了一個類,所以C++在剛提出來的時候是叫做 C WITH CLASS的。扯遠了,回來吧。vector就是一個類,提供了一組依附于該類的操作函數。這樣一來,我們在寫代碼的時候就可以調用這些函數為我們的項目服務,這樣就省去了我們很多事情(STL,standard template library正是為此而設計的,關于STL,請參考http://en.wikipedia.org/wiki/Standard_Template_Library)
二、vector的使用
明白了vector是什么了,那么我們就想知道vector怎么用,下面就給大家介紹一下Vector的用法。
vector定義在STL中的vector頭文件中,我們要使用vector,必須要把vector頭文件括進來,即:
#include<vector>,這是第一步,然后我們就可以開始使用vector提供的各種操作了。vector提供操作如下:
?
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
構造函數:創建一個vector對象,功能相當于C語言中定義一個變量
vector<Elem> c; //創建一個空的vector對象,就相當于定義了一個int整形變量,沒給賦值
vector<Elem> c1(c2);//c2為一個vector對象,用它來創建c1,相當于int i=j;j已經定義
vector<Elem> c(n);//創建一個vector容器,容量為n,即c里面可以放n個Elem類型的元素
vector<Elem> c(n,data);//創建一個vector,容量為n,n個元素的值都為data
vector<Elem> c(c1.begin(),c1.end());//相當于c=c1,c1調用兩個函數返回的是一種新的數據類型:迭代器,有關迭代器,請參考:http://baike.baidu.com/view/1413849.htm
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
?
############################################################################################################
常見操作:
assign(first,last):用迭代器first,last所指定的元素取代向量元素
assign(num,val):用val的num份副本取代向量元素
at(n):等價于[]運算符,返回向量中位置n的元素,因其有越界檢查,故比[]索引訪問安全
front():返回向量中第一個元素的引用
back():返回向量中最后一個元素的引用
begin():返回向量中第一個元素的迭代器
end():返回向量中最后一個元素的下一個迭代器(僅作結束游標,不可解引用)
max_size():返回向量類型的最大容量(2^30-1=0x3FFFFFFF)
capacity():返回向量當前開辟的空間大小(<= max_size,與向量的動態內存分配策略相關)
size():返回向量中現有元素的個數(<=capacity)
clear():刪除向量中所有元素
empty():如果向量為空,返回真
erase(start,end):刪除迭代器start end所指定范圍內的元素
erase(i):刪除迭代器i所指向的元素
erase()返回指向刪除的最后一個元素的下一位置的迭代器
insert(i,x);把x插入到迭代器i所指定的位置之前
insert(i,n,x):把x的n份副本插入到迭代器i所指定的位置之前
insert(i,start,end):把迭代器start和end所指定的范圍內的值插入到迭代器i所指定的位置之前
push_back(x):把x推入(插入)到向量的尾部
?
pop_back():彈出(刪除)向量最后一個元素
?
rbegin():返回一個反向迭代器,該迭代器指向的元素越過了向量中的最后一個元素
?
rend():返回一個反向迭代器,該迭代器指向向量中第一個元素
?
reverse():反轉元素順序
?
resize(n,x):把向量的大小改為n,新元素的初值賦為x
?
swap(vectorref):交換2個向量的內容
?
#############################################################################################
操作符重載函數:
operator()//返回容器中指定位置的元素,有關操作符重載函數請參考:http://baike.baidu.com/view/1033032.htm
析構函數:
~vector()//用于銷毀vector對象占用的系統資源,更詳細的析構函數介紹,請參考http://baike.baidu.com/view/1277985.htm
?
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
三、more about vector
1、vector是一種類似于數組的數據結構,確切的說應該是動態數組。在進行內存分配的時候必須是連續的一整塊空間
2、我們知道數組是有固定長度,而vector沒有,這也是我們稱之為動態數組的原因。那么vector是怎么實現動態數組的呢,例如申請一個vector<int> vec(10);一個
空間大小為10的vector,那么當里面存滿了10個元素了怎么辦呢。辦法是:重新分配一塊更大的空間比如20,然后把10個數據拷貝過去,釋放前面申請的10個元素的
空間
3、除此之外,在操作上他的很多特性跟數組一樣,如上面的介紹,大家可以一一試一下
4、在vector中做insert操作,效率很低,除了在末尾插入以外。因為vector是連續的,每次插入一個,插入位置后面的元素都要向后移動,這樣效率很低。所以vector不支持push_front操作。
5、刪除操作同樣效率很低
6、push_back操作很方便,有可能效率很低。
?
?
轉載于:https://www.cnblogs.com/wangyichao/p/3347643.html
總結
以上是生活随笔為你收集整理的顺序容器之vector的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: servlet核心API的UML图
- 下一篇: 心得体会2-7