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