C++STL之vector的说明及使用
創(chuàng)作初衷:
????在純C語(yǔ)言編程中,數(shù)組的創(chuàng)建必須是固定的大小,因?yàn)镃語(yǔ)言本身沒(méi)有提供動(dòng)態(tài)數(shù)組這種數(shù)據(jù)結(jié)構(gòu)。雖然可以通過(guò)malloc或calloc來(lái)動(dòng)態(tài)分配內(nèi)存(從堆中),但是仍需要指定內(nèi)存的大小,因此很不方便,比如:保存輸入的數(shù)組,但是并沒(méi)有說(shuō)明數(shù)組輸入的長(zhǎng)度。因此,引入C++中的vector。
(一)vector說(shuō)明:
????vector向量是一種順序行容器。相當(dāng)于數(shù)組,但是其大小可以死不預(yù)先指定給,并且自動(dòng)擴(kuò)展。他可以像數(shù)組一樣被操作,通過(guò)使用[]符號(hào)。因此可以將vector變量看做動(dòng)態(tài)數(shù)組。
在創(chuàng)建vector變量后,它會(huì)自動(dòng)在內(nèi)存中分配一塊連續(xù)的內(nèi)存空間來(lái)保存數(shù)據(jù),初始內(nèi)存空間大小可以預(yù)先指定,也可以由vector們默認(rèn)指定大小。當(dāng)存儲(chǔ)的數(shù)據(jù)超過(guò)分配的空間時(shí),vector會(huì)重新分配一塊內(nèi)存,但是這樣的分配很耗時(shí),在重新分配空間是它的步驟如下:
(1)vector 會(huì)申請(qǐng)一塊更大的內(nèi)存塊;
(2)將原來(lái)的數(shù)據(jù)拷貝到新的內(nèi)存塊中;
(3)銷(xiāo)毀掉原內(nèi)存塊中的對(duì)象(調(diào)用對(duì)象的析構(gòu)函數(shù));
(4)將原來(lái)的內(nèi)存空間釋放掉。
????當(dāng)vector保存的數(shù)據(jù)量很大時(shí),如果此時(shí)進(jìn)行插入數(shù)據(jù)導(dǎo)致需要更大的空間來(lái)保存這些數(shù)據(jù)量,那么將會(huì)大大的影響程序運(yùn)行的效率,所以我們應(yīng)該合理地使用vector。(二)定義vector對(duì)象的方式:
(1)初始化vector對(duì)象的方式:
vector<T> v1; //未指定初始化方式,因此采用默認(rèn)方式初始化v1,即長(zhǎng)度為0的空容器;
vector<T> v2; //定義對(duì)象v2,作為v1的副本;
vector<T3> v3(n,i);//定義對(duì)象v3,它包含n個(gè)數(shù)值為i的元素;
vector<T> v4(n); //定義對(duì)象v4,v4中包含n個(gè)元素,每個(gè)元素的值均是0;
其中:T可以為int,float,char,char*(存放字符串或字符指針)。一般用于int動(dòng)態(tài)數(shù)值時(shí),定義vector<T> v1,用v1來(lái)保存數(shù)值元素。
(2)vector的常用函數(shù):只需要包含#include<vector>即可
empty():判斷vector向量是否為為空,為空時(shí)返回真,否則返回假;
begin():返回向量(數(shù)組)的首元素的地址;
end():返回向量(數(shù)組)的末尾元素的下一個(gè)元素(不存在的元素)的地址;
clear():清空向量;
front():返回向量(數(shù)組)的第一個(gè)元素的數(shù)據(jù);
back():返回向量(數(shù)組)的最后一個(gè)元素的數(shù)據(jù);
size():返回向量中元素的個(gè)數(shù)(即數(shù)組長(zhǎng)度)
push_back(數(shù)據(jù)i):將數(shù)據(jù)插入到向量的尾部;
pop_back():刪除向量尾部的數(shù)據(jù)
....
非常重要的兩個(gè)操作:
insert() 函數(shù)有以下三種用法:?
1、在指定位置loc前插入值為val的元素,返回指向這個(gè)元素的迭代器
2、在指定位置loc前插入num個(gè)值為val的元素?
3、在指定位置loc前插入?yún)^(qū)間[start, end)的所有元素?
vec.insert(vec.begin()+i,a);在第i+1個(gè)元素前面插入a;使用方法:對(duì)象調(diào)用成員函數(shù)采用符號(hào)“.”,如v1.push_back(1);
(3)遍歷vector的方式:
vecor向量支持2中方式遍歷,因?yàn)榭梢哉J(rèn)為vector是一個(gè)動(dòng)態(tài)數(shù)組,所以可以使用數(shù)組下標(biāo)的方式;或是使用vector的迭代器(vector的迭代器的具體使用參考文檔《C++之迭代器Iterator》)。
#include <iostream> #include <vector> using namespace std;int main(void) {vector<int> vec;vec.push_back(1);vec.push_back(2);vec.push_back(3);vec.push_back(4);vec.push_back(5);cout << "向量的大小:" << vec.size() << endl;// 數(shù)組下標(biāo)方式遍歷vectorfor (int i = 0; i < vec.size(); i++)cout << vec[i] << " ";cout << endl;// 迭代器方式遍歷vector,注意:如果向量是常向量,如const vector<int> vec,//那么迭代器在定義是也需要定義為常量:vector<int>::const iterator itor = vec.begin();vector<int>::iterator itor = vec.begin();for (; itor != vec.end(); itor++)cout << *itor << " ";cout << endl;return 0; }(三)vector的特點(diǎn):
(1) 指定一塊如同數(shù)組一樣的連續(xù)存儲(chǔ),但空間可以動(dòng)態(tài)擴(kuò)展。即它可以像數(shù)組一樣數(shù)組一樣被操作,通過(guò)[]符號(hào)。可以進(jìn)行動(dòng)態(tài)操作,通常體現(xiàn)在push_back() pop_back();
(2) 隨機(jī)訪問(wèn)方便,它像數(shù)組一樣被訪問(wèn),即支持[ ] 操作符和vector.at();
(3) 節(jié)省空間,因?yàn)樗沁B續(xù)存儲(chǔ),在存儲(chǔ)數(shù)據(jù)的區(qū)域都是沒(méi)有被浪費(fèi)的,但是要明確一點(diǎn)vector 大多情況下并不是滿(mǎn)存的,在未存儲(chǔ)的區(qū)域?qū)嶋H是浪費(fèi)的;
(4)?在內(nèi)部進(jìn)行插入、刪除操作效率非常低,這樣的操作基本上是被禁止的。Vector 被設(shè)計(jì)成只能在后端進(jìn)行追加和刪除操作,其原因是vector 內(nèi)部的實(shí)現(xiàn)是按照順序表的原理;
(5) 只能在vector 的最后進(jìn)行push 和pop ,不能在vector 的頭進(jìn)行push 和pop ;
(6) 當(dāng)動(dòng)態(tài)添加的數(shù)據(jù)超過(guò)vector 默認(rèn)分配的大小時(shí)要進(jìn)行內(nèi)存的重新分配、拷貝與釋放,這個(gè)操作非常消耗性能。 所以要vector 達(dá)到最優(yōu)的性能,最好在創(chuàng)建vector 時(shí)就指定其空間大小。
總結(jié)
以上是生活随笔為你收集整理的C++STL之vector的说明及使用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 统计一个字符串中的单词数
- 下一篇: STM32F4启动流程分析