編程學習筆記之c++相關::vector學習心得

vector介紹:

     在c++中,vector是一個可以存儲各種類型對象的集合容器,可以把它看成一種能夠動態【喫胖】或【減肥】的數組。vector是一個類模板,使用【vector<T>】格式可以生成一個模板類,考慮到vector容器所應具備的一些特徵,vector應該設計成不管傳遞給vector的模板參數是什麼數據類型或類類型,一個vector生成的模板類,其內存大小應該是不變的。爲驗證我的想法,我在我的機器上測驗了一下,使用【sizeof(  A  )】獲得的內存大小爲16,其中A爲我的一個自定義類類型,不管我把A製造成多大,得到的結果總是 =16,然後我用高大上的開發工具vs13智能顯示了一下vector模板類裏面的數據成員,發現一共有4個,它們分別是:_Myfirst、_Myend、_Mylast和忘了怎麼拼寫的“myblabla。。。”,如果我沒猜錯的話,以上四種類型應該是三個指針和一個整型,它們所代表的意思分別是起始位置、終點位置、當前位置以及當前vector類所佔據的內存大小。值得一提的是,vector是一種線性順序式集合容器,雖然它可以動態分配存儲空間,但它所佔用的內存,是一塊連續存儲的內存。看到這裏也許您有點迷惑,既然是動態分配了,爲何還會像靜態變量那樣使用連續存儲內存呢?讓我先從設計初衷解釋一下,首先前輩們在製造vector時,希望它具有數組一樣的高效率,當我們通過下標訪問vector中的某個元素時,可以直接用指針偏移量的方式尋址訪問,而不要像鏈表那樣弄個循環找到那個位置。其次再從內存分配機制這個角度闡述一下,爲求容易理解,我使用例子吧:比如我們用vector生成一個int類容器A,那麼機器首先爲這個A在堆中開闢了一個大小爲100的連續內存區域【其中100是我隨便舉得例子,A本身的內存是16,A相當於一個標籤,貼在一個容器上面,這個容器現在的大小是100】,並把這塊區域當成是A的對應容器,然後程序運行到某個位置時,需要往容器裏面添加一個元素,但程序發現A容器已經飽和,一旦添加了這個元素,A現在對應的容器會容納不下,怎麼辦呢?程序會重新向堆中申請一塊更大的連續內存,比如200的大小。如果有,則把原先的100連續內存中的元素逐個拷貝到新內存區域中去,最後在拷貝完成之後,銷燬原先的100內存。這個過程是比較麻煩點,但好歹達到了目的——訪問方便。

      vector支持很多操作,向尾部添加元素可以用【push_back(T);】,其中T爲模板參數的引用;在尾部銷燬元素可以用【pop_back()】;在某個位置插入元素可以用【insert(n,T)】,其中n代表位置,T是模板參數的引用;判斷容器是否爲空可以用【empty()】,如果容器爲空,此表達式會返回true,否則返回false;清空容器用clear()等。除此之外,vector還定義了很多操作符重載,比如【!=】、【==】等。


vector的使用:

      要在程序中使用vector,首先我們要包含它所在的庫【#include <vector>】,並且還要做好相應的using說明【using std::vector;】,但爲了寫代碼方便,我的說明一向都寫成這樣【using namespace std;】。做好以上工作後,我們就可以在自己的代碼中使用vector生成模板類了。

      接下來說說vector生成模板類最常見的四種初始化情況,比如下面4個重載構造函數:

1):vector<int> vi;  //創建一個int類型的vector容器,但這個容器是空的。

2):vector<int> vi2(10);  //創建一個int類型的vector容器,該容器暫有10個int元素,每個元素被賦初始值0。

3):vector<int> vi3(5,99);  //創建一個int類型的vector容器,該容器暫有5個int元素,每個元素被賦值99。

4):vector<int> vi4(vi2);  //創建一個int類型vector容器,該容器拷貝了vi2,既該容器具有10個值爲0的元素。

      說了這麼多,下面讓我們寫一個簡單小程序來鞏固一下,該程序使用vector生成一個int型容器,然後由我們自己隨便給容器添加若干個元素,接着程序負責求出這些元素的平均值以及找出最大值,最後程序把求出的平均值插入到容器中間,再對容器內所有的元素按照遞增順序排列,代碼如下:

#include <iostream>
#include <vector>
#include <algorithm> //調用sort排序函數必須包含的頭文件
using namespace std;

int main()
{
	int value = 0, average = 0, max = 0, num = 0;
	vector<int>vi;
	
	while (cin >> value)  vi.push_back(value); //利用循環向容器插入數值元素

	cout << "現在容器內所有元素是:";
	for (vector<int>::size_type vinum = 0; vinum != vi.size(); vinum++) //使用size_type聲明一個變量,並用這個變量當作vi的下標
		cout << vi[vinum]<<" ";

	value = 0;
	for (vector<int>::const_iterator i = vi.begin(); i != vi.end(); i++) //這次換個方式遍歷,i是vector容器的指針
	{
		value += *i;
		num++;
		*i > max ? (max = *i) : 0;
	}
	cout << value << endl;
	average = value / num;
	cout << "容器內平均值是" << average << "\n最大值是" << max << endl;

	for (num = 0; num != vi.size(); num++);
	num /= 2;

	vi.insert(vi.begin() + num, 1, average);  //在這裏我們把平均值插入到容器中間
    sort(vi.begin(), vi.end());  //在這裏我們對容器內所有元素進行排序
	
	cout << "經過處理,容器內元素被處理成如下排列:";
	for (vector<int>::const_iterator i = vi.begin(); i != vi.end(); i++) //最後我們輸出經過處理的容器內所有元素
		cout << " " << *i;
	cout << endl;
	return 0;
}

運行結果如圖:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章