天天看點

C++之vector容器

一、STL的基本概念

STL(Standard Template Library)标準模闆庫大體上分為六大元件,分别為容器,算法,疊代器,仿函數,擴充卡和空間配置器,其中最重要的是容器,算法和疊代器,容器和算法之間通過疊代器無縫連接配接。

容器:各種資料結構,比如vector,list,deque,set,map等,用來存放資料;

算法:各種常用的算法,比如sort,find,copy,for_each等;

疊代器:提供一種方法,能夠依序尋訪某個容器所含的各個元素,每個容器都有自己專屬的疊代器。疊代器的使用非常類似于指針,可以将疊代器作為指針來了解。

二、vector容器的聲明和初始化

vector<T> v;	// T代表模闆,可以是任意的資料類型比如int,char,string等
vector<T> Name(v.begin(), v.end());	// 将[v.begin(), v.end)之間的元素指派建立的Name容器
vector<T> Name(n, elem); // 将Name初始化為包含10個elem值的容器
vector<T> Name(v);	// 拷貝構造函數,将容器v指派給容器Name
           

三、vector容器的增删改查

/***********************增加元素****************************/
push_back(elem);	// vector尾部插入元素elem
insert(const_iterator, elem);	// 在疊代器指向的位置插入元素elem

/***********************删除元素****************************/
pop_vack();			// 删除vector最後一個元素
erase(const_iterator);	// 删除疊代器指向位置的元素
erase(const_iterator start, const_iterator_end);	// 删除疊代器start和end之間所有的元素
clear();	// 删除vector之間的所有元素

/***********************通路元素****************************/
for(vector<int>::iterator it=v.begin(); it!=v.end(); it++)	//it是vector<int>的疊代器,可以了解為指向容器内元素的指針
for(auto it=v.begin(); it!=v.end(); it++) // 通過auto自動推理出it的類型
for(auto sub_v : v)	// 增強型for循環,直接通過底層的疊代器通路容器内元素
for(int i=0; i<v.size(); i++) // 普通for循環,i表示元素的下标,可以與數組一樣通過"v[i]"來通路,或者"v.at(int i)"
           

四、vector容器的特點

vector資料結構類似于數組,但是與普通數組不同的是:vector容器可以動态擴充,但是vector并不是在原空間之後續接新的空間,而是尋找更大的記憶體空間然後将中繼資料拷貝到新的空間,之後再釋放原空間。

但是每次vector擴充空間之後都會多預留一部分空間,當新增的元素個數不超過預留的空間時,便可以直接續接在原vector後面。

vector中使用size()函數來計算容器内元素的個數,而capacity()函數則傳回容器的容量。元素個數相當于vector内實際存儲的資料個數,而容器的容量則代表容器開辟的記憶體空間個數,是以容量>=元素個數。

下面我們來通過一段代碼來了解一下上述的内容:

vector<int>test;
int* p = nullptr;
int count=0;
for(int i=0; i<10; i++){
    test.push_back(i);	// 通過push_back的方式存入資料,理論上每push_back一次,vector便複制一次
    if(p != &test[0]){	// 如果容器進行了複制,那麼首位址必然會變,記錄下首位址的變化次數,便得到複制次數
        p = &test[0];
        count++;
    }
}
cout << "vector 複制的次數:" << count << endl;	// 輸出複制次數
cout << "vector 的容量:" << test.capacity() << endl;	// 輸出vector的容量
cout << "vector 的元素個數:" << test.size() << endl;	  // 輸出vector的元素個數
/************************輸出結果***********************/
vector 複制的次數:7	// 可以看出vector隻複制了7次,可以判斷每次vector在複制時預留了空間
vector 的容量:13	 //  此時,vector中有13個位置,比元素個數多3個,即為預留的空間
vector 的元素個數:10 // 正兒八經的元素個數
           

繼續閱讀