Vector容器主要函式說明

xl小林同學發表於2020-12-03

C++ STL標準模板庫

vector容器

vector容器相當於單端陣列,但與普通陣列的區別為:
普通陣列是靜態空間,vector容器是可擴充套件的。擴充時不是在原空間後繼續開拓空間,而是重新找一塊更大的空間,將資料拷貝到新空間中,並釋放原空間。

容器示意圖:

在這裡插入圖片描述

特點:

1.前端封閉,只能在後端插入push_back() 和彈出pop_back(), front()指向第一個資料,back()指最後一個資料;
2.可以利用迭代器對容器中內容進行遍歷,其中v.begin()指向第一個元素,v.end()指向最後一個元素的下一個位置,v.rbegin()指向最後一個元素,v.rend()指向第一個元素的前一個位置。

相關的函式及操作

遍歷列印輸出

void printVector(vector<int>& v) {

	for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {
		cout << *it << " ";
	}
	cout << endl;
}
int main() {
	vector<int> v;
	for(int i = 0; i < 20; i++){
		v.push_back(i);
	}
	//列印v
	printVector(v);
}

1. 建構函式

(1) 功能描述:建立vector容器

(2) 函式原型:

  • vector<T> v;; //採用模板實現類實現,預設建構函式
  • vector(v.begin, v.end()); //將v[begin(), end())區間中的元素拷貝給本身。
  • vector(n, elem);; //建構函式將n個elem拷貝給本身。
  • vector(const vector &vec); //拷貝建構函式。

2. 賦值

(1) 功能描述:給vector容器進行賦值

(2) 函式原型:

  • vector& operator=(const vector &vec);//過載等號操作符

  • assign(beg, end); //將[beg, end)區間中的資料拷貝賦值給本身。

  • assign(n, elem);; //將n個elem拷貝賦值給本身。

3. 容量和大小

(1) 功能描述:對vector容器進行容量和大小操作

(2) 函式原型:

  • empty() ; //判斷容器是否為空
  • size(); //獲取容器的大小
  • capacity(); //獲取容器的容量
  • resize( num );//重新指定容器長度為num(int型別),若容器變長,則以預設值0填充新位置;若容器變短,則末尾超出容器長度的元素被刪除。
  • resize(num, elem) //與上同,但預設的填充元素變為elem;

4. 插入和刪除

(1) 功能描述:對vector容器進行插入和刪除操作

(2) 函式原型:

  • push_back(elem); //在尾部插入資料elem
  • pop_back(); //刪除最後一個元素
  • insert(const_iterator pos, elem) //在迭代器指向的位置插入元素elem
  • insert(const_iterator pos, int count, elem) //在迭代器指向的位置處插入count 個 elem
  • erase(const_iterator pos); //刪除迭代器指向的元素

5. 資料存取

(1) 功能描述:訪問vector容器中的元素

(2) 函式原型:

  • at(int index) //返回索引值 index 所指的元素
  • operator[] //返回索引值 index 所指的元素
  • front() //返回容器中第一個元素
  • back() //返回容器中最後一個元素

6. 互換容器

(1) 功能描述:將兩個vector容器中資料進行交換

(2) 函式原型:

  • swap()

案例演示:

//建立兩個容器
vector<int> v1;
vector<int> v2;
//向v1,v2中加入資料
v1.push_back(1);
v2.push_back(2);
.....
//將v1和v2交換
v1.swap(v2);

交換容器的用途:

縮小容器中容量,避免空間浪費,案例程式碼如下:

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

	cout << "v的容量為:" << v.capacity() << endl; //100000+
	cout << "v的大小為:" << v.size() << endl;     //100000

	//重新給容器設定大小
	v.resize(3);

	//此時容器的容量仍為為數值,會造成空間浪費
	cout << "v的容量為:" << v.capacity() << endl; //100000+
	cout << "v的大小為:" << v.size() << endl;     //3

	//收縮記憶體
	vector<int>(v).swap(v); 
	/* 其中,vector<int>(v)為匿名物件
	       .swap(v)為容量交換(可視為指標交換)
	 */
	
	cout << "v的容量為:" << v.capacity() << endl; //3
	cout << "v的大小為:" << v.size() << endl;     //3

7. 預留空間

(1) 功能描述:減少vector在動態擴充套件容量時的擴充套件次數

(2) 函式原型:

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

示例:

#include <vector>

void test01()
{
	vector<int> v;

	//預留空間
	v.reserve(100000);

	//記錄開闢記憶體的次數
	int num = 0;
	//記錄開闢空間的初始位置
	int* p = NULL;
	for (int i = 0; i < 100000; i++) {
		v.push_back(i);
		/* 若此時指標p指向的位置不是容器的初始位置
		   說明已經開闢了新的空間
		   因為p->原容器首位,後來重新開闢空間
		       p->原位置,但容器首位的地址改變了!
		 */
		if (p != &v[0]) {
			p = &v[0];
			num++;
		}
	}
	cout << "num:" << num << endl;
}

int main() {

	test01();
    
	system("pause");

	return 0;
}

參考博文:

  • Vector容器

https://blog.csdn.net/qq_34552225/article/details/104597891?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522160683528619724813230573%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=160683528619724813230573&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduend~default-1-104597891.pc_first_rank_v2_rank_v28&utm_term=%E5%8D%95%E7%AB%AF%E6%95%B0%E7%BB%84&spm=1018.2118.3001.4449

相關文章