C++ Vecctor容器浅析
生活随笔
收集整理的這篇文章主要介紹了
C++ Vecctor容器浅析
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
Vector的定義
- 向量(Vector)是一個(gè)封裝了動(dòng)態(tài)大小數(shù)組的順序容器(Sequence Container)。跟任意其它類型容器一樣,它能夠存放各種類型的對象。可以簡單的認(rèn)為,向量是一個(gè)能夠存放任意類型的動(dòng)態(tài)數(shù)組。
- vector是對象的集合,其中所有對象的類型都相同。集合中的每個(gè)對象都有一個(gè)與之對應(yīng)的索引,索引用于訪問的對象。
- vector是模板而不是類型,由vector生成的類型必須包含vector中元素的類型,比如vector<int>。
- vector不可以將引用作為其元素,因?yàn)橐貌皇菍ο蟆?/li>
定義和初始化vector對象
- 和任何類型一樣,vector模板模板控制著定義和初始化向量的方法。
| Vector<T> v1 | v1是一個(gè)空的vector,潛在的元素是T類型的,執(zhí)行默認(rèn)初始化 |
| Vector<T> v2(v1) | v2中包含v1中所有元素的副本 |
| Vector<T> v2 = v1 | 等效于v2(v1),v2中包含v1中所有元素的副本 |
| Vector<T> v3(n,val) | v3中包含n個(gè)重復(fù)的元素,每個(gè)元素的數(shù)值都是val |
| Vector<T> v4(n) | v3包含了n個(gè)重復(fù)地執(zhí)行值初始化的對象 |
| Vector<T> v5{a,b,c.......} | v5包含了初始值個(gè)數(shù)的元素,每個(gè)元素被賦予相應(yīng)的初始數(shù)值 |
| Vector<T> v5={a,b,c.....} | 等效于Vector<T> v5{a,b,c.......} |
- 使用方法,先定義一個(gè)空的vector,當(dāng)運(yùn)行的時(shí)候?qū)@取到的元素?cái)?shù)值逐一添加。
- vector之間進(jìn)行賦值拷貝,需要逐一一個(gè)前提,那就是類型必須是一致的。
列表初始化vector對象?
- 使用拷貝初始化時(shí)(即使用=),只可以提供一個(gè)初始數(shù)值
- 使用提供的是一個(gè)類內(nèi)初始值,則可以使用拷貝初始化或者使用花括號的形式進(jìn)行初始化
- 如果提供的是初始元數(shù)值的列表,則只能把初始值都放在圓括號里面進(jìn)行列表初始化,但是不能放在圓括號里面。
- 例如: vector<string> v1 = {"a","ccc","ddd"}; //正確,列表初始化
- 例如: vector<string> v1 = ("a","ccc","ddd"); //錯(cuò)誤,不可以使用圓括號
創(chuàng)建指定數(shù)量的元素
- 還可以使用vector對象容納的元素?cái)?shù)量和所有元素的統(tǒng)一初始值來初始化vector對象。
- vector<int> v1(10,-1);//創(chuàng)建10個(gè)int類型的元素,每個(gè)元素的數(shù)值都被初始化為-1
- vector<string> v2(10,"hi!");//創(chuàng)建10個(gè)string類型的元素,每個(gè)元素的數(shù)值都被初始化為hi!
值初始化
- 可以只提供vector對象容納的元素?cái)?shù)量,而不提供初始數(shù)值。此時(shí)庫會(huì)創(chuàng)建一個(gè)值初始化的元素初值,并將其賦值給容器中所有的元素。這個(gè)初值由vector對象中的元素類型決定。
- 如果vector的對象元素類型是內(nèi)置類型的,比如int,則元素初始值會(huì)被自動(dòng)設(shè)置為0;如果是string類型的,則元素由類默認(rèn)初始化。
限制要求
- 1,有些類必須明確的提供初始值,如果vector對象中元素的類型不支持默認(rèn)初始化,就必須提供初始的元素值
- 2,如果只提供了元素的數(shù)量沒有提供元素的初始值,只能使用直接初始化。vector<int> v1 = 10;//錯(cuò)誤,使用直接初始化
列表初始值還是元素的數(shù)量
-
初始化的真實(shí)含義依賴于傳遞初始值的時(shí)候使用的是花括號還是圓括號
向vector中添加元素
- 直接初始化常見于三種場景:1,初始值已知且數(shù)量較少;2,初始值是另外一個(gè)vector對象的副本;3,所有元素的初始值一致
- 使用函數(shù)push_back將元素添加到vectro容器的末尾,下面的例子是將100個(gè)元素押入容器中
- 從標(biāo)準(zhǔn)輸入中讀取單詞,將其作為vector對象的元素進(jìn)行存儲(chǔ)
- ?循環(huán)體內(nèi)部包含了有向vector對象添加元素的語句,則不可以使用范圍for循環(huán)。
其他vector操作
| v.empty() | 如果v不含有任何元素,返回為真;否則返回為假 |
| v.size() | 返回元素的個(gè)數(shù) |
| v.push_back(t) | 向v的末尾添加一個(gè)數(shù)值為t的元素 |
| v[n] | 返回v中第n個(gè)位置上元素的引用 |
| v1=v2 | 用v2中的元素拷貝替換v1中的元素 |
| v1={a,b,c...} | 用列表中的元素拷貝替換v1中的元素 |
| v1 == v2? | v1和v2相等當(dāng)且僅當(dāng)元素?cái)?shù)量相同,且對應(yīng)位置上的元素值都相等 |
| v1 != v2 | ? |
| < <= >= > | 以字典序比較大小 |
- 訪問vector中的元素和訪問string對象中字符的方式差不多,也是通過元素在vector對象上的位置。?例如可以使用范圍for語句來處理vector中所有元素。
第一個(gè)循環(huán)把控制變量i定義成引用類型,這樣就可以通過i給v的元素賦值
- 要使用size_type的時(shí)候,需要指定它是由哪種類型定義的。例如:vector<int>::size_type? ?//正確
計(jì)算Vector內(nèi)對象的索引
- 可以通過下標(biāo)運(yùn)算符來獲取指定的元素;還可以通過計(jì)算得到vector內(nèi)對象的索引,然后直接獲取索引位置上的元素。
- ?計(jì)算得到vector內(nèi)對象的索引,舉個(gè)例子,對于輸入的成績進(jìn)行歸檔,每10分一個(gè)檔次。計(jì)算方式是將其除以10就能得到對應(yīng)的分?jǐn)?shù)段索引,例如65/10 = 6;42/10 = 4;一旦計(jì)算得到了分?jǐn)?shù)段索引,就可以把它作為vector對象的下標(biāo),進(jìn)而可以獲取該分?jǐn)?shù)段的計(jì)算值并加1。
不可以使用下標(biāo)的形式添加元素
vector<int> ivec;//空的vector對象for(decltype(ivec.size()) ix = 0; ix != 10; ix++){ivec[ix] = ix;//嚴(yán)重錯(cuò)誤,vector不包含任何的元素}- 正確的方法是通過push_back的方法,將元素逐一押入容器中。
- vector對象的下標(biāo)運(yùn)算符可以用于訪問已經(jīng)存在的元素,但是不可以用于添加元素。?
容器的特性
順序序列
- 順序容器中的元素按照嚴(yán)格的線性順序排序。可以通過元素在序列中的位置訪問對應(yīng)的元素。
動(dòng)態(tài)數(shù)組
能夠感知內(nèi)存分配器的(Allocator-aware)
- 容器使用一個(gè)內(nèi)存分配器對象來動(dòng)態(tài)地處理它的存儲(chǔ)需求
基本函數(shù)實(shí)現(xiàn)
1.構(gòu)造函數(shù)
- vector():創(chuàng)建一個(gè)空vector
- vector(int nSize):創(chuàng)建一個(gè)vector,元素個(gè)數(shù)為nSize
- vector(int nSize,const t& t):創(chuàng)建一個(gè)vector,元素個(gè)數(shù)為nSize,且值均為t
- vector(const vector&):復(fù)制構(gòu)造函數(shù)
- vector(begin,end):復(fù)制[begin,end)區(qū)間內(nèi)另一個(gè)數(shù)組的元素到vector中
2.增加函數(shù)
- void push_back(const T& x):向量尾部增加一個(gè)元素X
- iterator insert(iterator it,const T& x):向量中迭代器指向元素前增加一個(gè)元素x
- iterator insert(iterator it,int n,const T& x):向量中迭代器指向元素前增加n個(gè)相同的元素x
- iterator insert(iterator it,const_iterator first,const_iterator last):向量中迭代器指向元素前插入另一個(gè)相同類型向量的[first,last)間的數(shù)據(jù)
3.刪除函數(shù)
- iterator erase(iterator it):刪除向量中迭代器指向元素
- iterator erase(iterator first,iterator last):刪除向量中[first,last)中元素
- void pop_back():刪除向量中最后一個(gè)元素
- void clear():清空向量中所有元素
4.遍歷函數(shù)
- reference at(int pos):返回pos位置元素的引用
- reference front():返回首元素的引用
- reference back():返回尾元素的引用
- iterator begin():返回向量頭指針,指向第一個(gè)元素
- iterator end():返回向量尾指針,指向向量最后一個(gè)元素的下一個(gè)位置
- reverse_iterator rbegin():反向迭代器,指向最后一個(gè)元素
- reverse_iterator rend():反向迭代器,指向第一個(gè)元素之前的位置
5.判斷函數(shù)
- bool empty() const:判斷向量是否為空,若為空,則向量中無元素
6.大小函數(shù)
- int size() const:返回向量中元素的個(gè)數(shù)
- int capacity() const:返回當(dāng)前向量所能容納的最大元素值
- int max_size() const:返回最大可允許的vector元素?cái)?shù)量值
7.其他函數(shù)
- void swap(vector&):交換兩個(gè)同類型向量的數(shù)據(jù)
- void assign(int n,const T& x):設(shè)置向量中第n個(gè)元素的值為x
- void assign(const_iterator first,const_iterator last):向量中[first,last)中元素設(shè)置成當(dāng)前向量元素
8.補(bǔ)充完善
- push_back 在數(shù)組的最后添加一個(gè)數(shù)據(jù)
- pop_back 去掉數(shù)組的最后一個(gè)數(shù)據(jù)
- at 得到編號位置的數(shù)據(jù)
- begin 得到數(shù)組頭的指針
- end 得到數(shù)組的最后一個(gè)單元+1的指針
- front 得到數(shù)組頭的引用
- back 得到數(shù)組的最后一個(gè)單元的引用
- max_size 得到vector最大可以是多大
- capacity 當(dāng)前vector分配的大小
- size 當(dāng)前使用數(shù)據(jù)的大小
- resize 改變當(dāng)前使用數(shù)據(jù)的大小,如果它比當(dāng)前使用的大,則填充默認(rèn)值
- reserve 改變當(dāng)前vecotr所分配空間的大小
- erase 刪除指針指向的數(shù)據(jù)項(xiàng)
- clear 清空當(dāng)前的vector
- rbegin 將vector反轉(zhuǎn)后的開始指針返回(其實(shí)就是原來的end-1)
- rend 將vector反轉(zhuǎn)構(gòu)的結(jié)束指針返回(其實(shí)就是原來的begin-1)
- empty 判斷vector是否為空
- swap 與另一個(gè)vector交換數(shù)據(jù)
基本用法
- #include < vector> using namespace std;
簡單的介紹
Vector<類型>vi(I,i+2);//得到i索引值為3以后的值
相關(guān)知識的引用
模板
- 模板本身不是類或者函數(shù),相反可以把模板看做是編譯器生成類或者函數(shù)的說明。編譯器根據(jù)模板創(chuàng)建類或者函數(shù)的過程稱為實(shí)例化,當(dāng)使用模板的時(shí)候,需要指出編譯器把類或者函數(shù)實(shí)例化成為哪種類型。
- 對于類模板來講,提供一些額外的類來指定將模板實(shí)例化成為什么樣的類。需要提供的信息是由模板來決定的,即在模板名字的后面跟上一段尖括號,在括號上放上相關(guān)的信息。
- 以vector為例,提供的額外信息是vector內(nèi)所存放對象的類型
緩沖區(qū)溢出
- 通過下標(biāo)訪問不存在的元素會(huì)導(dǎo)致緩沖區(qū)溢出。
總結(jié)
以上是生活随笔為你收集整理的C++ Vecctor容器浅析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 前端的单页面模式SPA和多页面模式MPA
- 下一篇: 属性加密技术及基于属性的ABE算法的访问