首頁 > 軟體

STL中vector的使用你瞭解嗎

2022-03-28 19:00:29

前言

當我們使用C語言的語法來實現陣列的時候,增刪查改都需要自己來定義函數,STL中給出了陣列模板vector,其中包含函數可以幫助我們更便捷地處理陣列。

1.vector是什麼

1.vector是一個表示可變大小陣列的容器。

2.vector採用連續儲存空間來進行元素的儲存。

3.vector使用動態分配陣列來儲存它的元素。

2.vector建立物件

以下為vector的四種拷貝建構函式。

    vector<int> v1;//建立空物件v1
	vector<int> v2(10, 8);//建立有十個8的物件v2
	vector<int> v3(++v2.begin(), --v2.end());//通過迭代器進行拷貝構造,迭代器可以加減操作
	vector<int> v4(v3);//拷貝構造
	string s("hello world");
	vector<char> v5(s.begin(), s.end());

vector建立物件的過程也就是它呼叫其建構函式和拷貝構造的過程,我們也可以將s中字串存入容器v5中。
注意vector<char>不能取代string,這是因為使用vector<char>需要手動列印’’,並且vector也不支援+=和比較大小等一系列的操作。

3.遍歷vector

為了更好地演示,我們先定義一個陣列,並向其中傳入資料。

vector<int> v;
	v.push_back(1);
	v.push_back(2);
	v.push_back(3);
	v.push_back(4);
	v.push_back(5);

(1)下標遍歷

下標遍歷可讀可寫。

	for (int i = 0; i < v.size(); i++)
	{
		v[i] += 1;//可以修改,因為返回的值是參照
		cout << v[i] << endl;
	}

(2)迭代器遍歷

vector&lt;int&gt;::iterator it = v.begin();while (it != v.end()){*it -= 1;cout &lt;&lt; *it &lt;&lt; " " ;++it;}

(3)範圍for遍歷

	for (auto& e: v)
	{
		cout << e << " ";
	}

原生指標就是天然的迭代器,陣列支援範圍for會被替換成指標。

3.vector容量函數

表示vector容量的函數一共有三個。

	cout << v2.size() << endl;
	cout << v2.capacity() << endl;
	cout << v2.max_size() << endl;

v2.size()表示的是目前元素個數。

v2.capacity()表示的是最大容量。

v2.max_xize()表示的是系統可以分配的給vector<int>的最大容量(還未分配)。

如果記憶體是一個圖書館的話,vector<int>表示的是一個書架,size()就表示書架上放了多少書,capacity()表示的就是書架的最大容量,max_size表示的是圖書館中最大能放一個容量為多大的書架。

4.vector的擴容函數

我們使用vector的時候通常也是在堆上開闢空間的。這就需要用到兩個函數,reseveresize,其使用方法和string的一樣,reserve只開空間不初始化,resize開空間而且還初始化,不傳初始化內容預設為0。

	vector<int> v2(10,45);//建立有十個8的物件v2
	cout << v2.size() << endl;
	cout << v2.capacity() << endl;
	v2.reserve(20);
	cout << v2.size() << endl;
	cout << v2.capacity() << endl;

resize需要藉助偵錯來觀察初始化的內容:

通過偵錯我們可以看到新開闢的空間裡都初始化成了0。

我們還可以通過assign函數來將之前的內容進行覆蓋。

	vector<int> v1;//建立空物件v1
	vector<int> v2(10,45);//建立有十個8的物件v2
	v2.assign(20, 5);

5.vector的插入刪除

(1)尾插與尾刪

插入刪除主要使用四個函數:

尾插:push_back

尾刪:pop_back

定點插入:insert

定點刪除:erase

刪除所有資料:clear

	vector<int> v1;//建立空物件v1
	v1.push_back(1);
	v1.push_back(2);
	v1.push_back(3);
	v1.push_back(4);
	for (auto& e: v1)
	{
		cout << e << " ";
	}

pop_back這裡就不演示了,就是一個簡單的尾刪。

(2)insert與erase

insert與erase是最容易引起迭代器失效的兩個函數,關於迭代器失效的原理我會在下一節vector的模擬實現中詳細解釋。現在只需要記住string與vector迭代器失效的兩種情況即可:

1.如果空間被重新分配,則指向容器的迭代器、指標和參照都會失效。

2.如果空間沒被重新分配,指向插入位置之前的元素的迭代器、指標和參照依然有效,但指向插入位置之後元素的帶帶器、指標和參照將會失效。

注意,這裡的迭代器指的是我們自己定義的迭代器。

	vector<int>::iterator ret = v1.begin();
	v1.insert(ret, 0);//在ret處插入0

我們可以通過insert來進行插入元素。

但當我們進行刪除的時候,如果這樣寫程式會報錯的。

	vector<int>::iterator ret = v1.begin();
	v1.insert(ret, 0);
	v1.erase(ret);

這是因為我們對v1進行了插入資料,空間被重新分配了,原有的ret失效了。如果要刪除首元素,需要使用v1.begin()來刪除。

為了保險起見,使用插入或者刪除的操作之後,一定要記得更新迭代器。

(3)clear

clear會刪除所有資料,注意一點,刪除資料不會刪除容量。

vector的特殊應用 

vector<vector <int>>

表示一個二維陣列,vector本身就是一個模板型別,裡面也可以存放一個vector<int>的型別。

相當於vector本身是一個陣列,它的每個資料又是一個int型別的陣列。

vector<string>

表示陣列中每一個元素都是一個字串。

6.總結

vector的基本函數都介紹完了,這些已經足夠我們使用了,如果知識在精不在多,如果還希望瞭解更過vector的成員函數的話,可以登入cplusplus.com來進行搜尋。

本篇文章就到這裡了,希望能夠給你帶來幫助,也希望您能夠多多關注it145.com的更多內容!     


IT145.com E-mail:sddin#qq.com