STL_vector容器

1、Vector容器簡介

vector是將元素置於一個動態數組中加以管理的容器。數組

vector能夠隨機存取元素(支持索引值直接存取, 用[]操做符或at()方法)。函數

vector尾部添加或移除元素很是快速,可是在中部或頭部插入元素或移除元素比較費時。指針

2、vector對象的默認構造

vector採用模板類實現,vector對象的默認構造形式:vector<T> vecT;code

vector<int> vecInt;     //一個存放int的vector容器。

vector<float> vecFloat;    //一個存放float的vector容器。

vector<string> vecString;   //一個存放string的vector容器。

...                  //尖括號內還能夠設置指針類型或自定義類型。

Class CA{};

vector<CA*> vecpCA;      //用於存放CA對象的指針的vector容器。

vector<CA> vecCA;       //用於存放CA對象的vector容器。因爲容器元素的存放是按值複製的方式進行的,因此此時CA必須提供CA的拷貝構造函數,以保證CA對象間拷貝正常。

3、vector對象的帶參數構造

vector(beg,end); //構造函數將[beg, end)區間中的元素拷貝給自己。注意該區間是左閉右開的區間。對象

vector(n,elem); //構造函數將n個elem拷貝給自己。索引

vector(const vector &vec); //拷貝構造函數內存

void printVector(vector<int>& v) {
	for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {
		cout << *it << " ";
	}
	cout << endl;
}
vector<int> vl;//默認構造

	int arr[] = { 10, 20, 30, 40 };
	vector<int> v2(arr, arr + sizeof(arr) / sizeof(int));
	vector<int> v3(v2.begin(), v2.begin()+3);
	vector<int> v4(v3);
	vector<int> v5(4,5);

	printVector(v2);
	printVector(v3);
	printVector(v4);
	printVector(v5);
/*
結果:
10 20 30 40
10 20 30
10 20 30
5 5 5 5
*/

4、vector的賦值

vector.assign(beg,end); //將[beg, end)區間中的數據拷貝賦值給自己。注意該區間是左閉右開的區間。ci

vector.assign(n,elem); //將n個elem拷貝賦值給自己。string

vector& operator=(const vector &vec); //重載等號操做符it

vector.swap(vec); // 將vec與自己的元素互換。

int arr[] = { 10, 20, 30, 40 };
	vector<int> v1(arr, arr + sizeof(arr) / sizeof(int));//默認構造

	//成員方法
	vector<int> v2;
	v2.assign(v1.begin(), v1.end());

	//重載=
	vector<int> v3;
	v3 = v2;

	int arr1[] = { 100, 200, 300, 400 };
	vector<int> v4(arr1, arr1 + sizeof(arr) / sizeof(int));//默認構造

	printVector(v1);
	printVector(v2);
	printVector(v3);
	printVector(v4);

	cout << "------------------" << endl;

	v4.swap(v1);
	printVector(v1);
	printVector(v2);
	printVector(v3);
	printVector(v4);
/*
結果:
10 20 30 40
10 20 30 40
10 20 30 40
100 200 300 400
------------------
100 200 300 400
10 20 30 40
10 20 30 40
10 20 30 40
*/

5、vector的大小

vector.size(); //返回容器中元素的個數

vector.empty(); //判斷容器是否爲空

vector.resize(num); //從新指定容器的長度爲num,若容器變長,則以默認值填充新位置。若是容器變短,則末尾超出容器長度的元素被刪除。

vector.resize(num, elem); //從新指定容器的長度爲num,若容器變長,則以elem值填充新位置。若是容器變短,則末尾超出容器長度的元素被刪除。

capacity();//容器的容量

reserve(int len);//容器預留len個元素長度,預留位置不初始化,元素不可訪問。

int arr1[] = { 100, 200, 300, 400 };
	vector<int> v4(arr1, arr1 + sizeof(arr1) / sizeof(int));//默認構造

	cout << "size:" << v4.size() << endl;
	if (v4.empty()) {
		cout << "空!" << endl;
	}
	else {
		cout << "不空!" << endl;
	}

	printVector(v4);
	v4.resize(2);
	printVector(v4);
	v4.resize(6);
	printVector(v4);
	v4.resize(8, 1);
	printVector(v4);

	for (int i = 0; i < 10000; i++) {
		v4.push_back(i);
	}
	cout << "size:" << v4.size() << endl;  
	cout << "容量:" << v4.capacity() << endl;//容量不必定等於size
/*
結果:
size:4
不空!
100 200 300 400
100 200
100 200 0 0 0 0
100 200 0 0 0 0 1 1
size:10008
容量:12138
*/

6、vector末尾的添加移除操做

vector.push_back(); //在容器尾部加入一個元素

vector.pop_back();; //移除容器中最後一個元素

int arr1[] = { 100, 200, 300, 400 };
	vector<int> v1(arr1, arr1 + sizeof(arr1) / sizeof(int));//默認構造

	v1.push_back(500);
	v1.push_back(600);
	v1.push_back(700);
	v1.pop_back();
	printVector(v1);
/*
結果:
100 200 300 400 500 600100 200 300 400 500 600
*/

7、vector的數據存取

vector.at(int idx); //返回索引idx所指的數據,若是idx越界,拋出out_of_range異常。

vector[int idx];//返回索引idx所指的數據,越界時,運行直接報錯

vector.front();//返回容器中第一個數據元素

vector.back();//返回容器中最後一個數據元素

int arr1[] = { 100, 200, 300, 400 };
	vector<int> v4(arr1, arr1 + sizeof(arr1) / sizeof(int));//默認構造

	//區別: at拋異常 []不拋異常
	for (int i = 0; i < v4.size(); i++) {
		cout << v4[i] << " ";
	}
	cout << endl;

	for (int i = 0; i < v4.size(); i++) {
		cout << v4.at(i) << " ";
	}
	cout << endl;

	cout << "front:" << v4.front() << endl;
	cout << "back:" << v4.back() << endl;
/*
結果:
100 200 300 400
100 200 300 400
front:100
back:400
*/

8、vector的插入和刪除

vector.insert(pos,elem); //在pos位置插入一個elem元素的拷貝,返回新數據的位置。

vector.insert(pos,n,elem); //在pos位置插入n個elem數據,無返回值。

vector.insert(pos,beg,end); //在pos位置插入[beg,end)區間的數據,無返回值

vector.clear(); //移除容器的全部數據

vector.erase(beg,end); //刪除[beg,end)區間的數據,返回下一個數據的位置。

vector.erase(pos); //刪除pos位置的數據,返回下一個數據的位置。

vector<int> v;
	v.push_back(10);
	v.push_back(20);
	//頭插法
	v.insert(v.begin(), 30);
	v.insert(v.end(), 40);

	v.insert(v.begin() + 2, 100); //vector支持隨機訪問

	//支持數組下標,通常都支持隨機訪問
	//迭代器能夠直接+2 +3 -2 -5操做
	printVector(v);

	//刪除
	v.erase(v.begin());
	printVector(v);
	v.erase(v.begin() + 1, v.end());
	printVector(v);
	v.clear();
	cout << "size:" << v.size() << endl;
/*
結果:
30 10 100 20 40
10 100 20 40
10
size:0
*/

9、巧用swap,收縮內存空間

vector<T>(x).swap(x); //其中,x 指當前要操做的容器,T 爲該容器存儲元素的類型。

//vector添加元素 他會自動增加 你刪除元素時候,不會自動減小

	vector<int> v;
	for (int i = 0; i < 100000; i++) {
		v.push_back(i);
	}

	cout << "size:" << v.size() << endl;
	cout << "capacity:" << v.capacity() << endl;

	v.resize(10);
	cout << "--------------" << endl;
	cout << "size:" << v.size() << endl;
	cout << "capacity:" << v.capacity() << endl;

	//收縮空間
	vector<int>(v).swap(v);

	cout << "--------------" << endl;
	cout << "size:" << v.size() << endl;
	cout << "capacity:" << v.capacity() << endl;
/*
結果:
size:100000
capacity:138255
--------------
size:10
capacity:138255
--------------
size:10
capacity:10
*/

10、reserve 預留空間

vector的reserve增長了vector的capacity,可是它的size沒有改變!而resize改變了vector的capacity同時也增長了它的size!

緣由以下:

  • reserve是容器預留空間,但在空間內不真正建立元素對象,因此在沒有添加新的對象以前,不能引用容器內的元素。加入新的元素時,要調用push_back()/insert()函數。
  • resize是改變容器的大小,且在建立對象,所以,調用這個函數以後,就能夠引用容器內的對象了,所以當加入新的元素時,用operator[]操做符,或者用迭代器來引用元素對象。此時再調用push_back()函數,是加在這個新的空間後面的。
int num = 0;
	int* address = NULL;

	vector<int> v;
	v.reserve(100000);
	for (int i = 0; i < 100000; i++) {
		v.push_back(i);
		if (address != &(v[0])) {
			address = &(v[0]);
			num++;
		}
	}

	cout << "num:" << num << endl;//申請num次空間
/*
結果:
num:1
*/

若是一個vector使用默認的capacity,那麼在push_back操做的時候,會根據添加元素的數量,動態的自動分配空間,2^n遞增;若是聲明vector的時候,顯式的使用capacity(size_type n)來指定vector的容量,那麼在push_back的過程當中(元素數量不超過n),vector不會自動分配空間,提升程序效率。

相關文章
相關標籤/搜索