深度解析C++ STL容器vector原理及用法

2022-01-02 17:00:02

std::vector

返回目錄(建議收藏)【目錄】全面理解C++ STL標準模板庫

原理程式碼

template <class T,class Alloc=allocator<T>> class vector; 
// generic template

vector概念

vector是表示可以改變大小的陣列的序列容器.
就像陣列一樣,向量為它們的元素使用連續的儲存位置,這意味著它們的元素也可以使用指向其元素的常規指標上的偏移量來存取,並且與在陣列中一樣有效. 但與陣列不同的是,它們的大小可以動態變化,它們的儲存由容器自動處理。
在這裡插入圖片描述

0.標頭檔案

#include<vector>

1.定義vector的方式

(1)常見定義方式

std::vector<int> vitem1{1,2,3,4};	//1.直接賦值

int a[5] = {1,3,6,8,4};
std::vector<int> vitem2(a,a+5);		//2.陣列賦值

std::vector<int> vitem3;			//3.vector容器的預設構造 
for(int i=0;i<50;i+=5){vitem3.push_back(i);} //方法一
vitem3.assign(10,66);  //方法二

std::vector<int> vitem4(vitem4.begin(),vitem4.end()); //4.區間進行構造

std::vector<int> vitem5(5,6);		//5.n個elem進行構造

std::vector<int> vitem6(vitem5);	//6.拷貝構造

(2)案例分析

案例程式碼
在這裡插入圖片描述
結果輸出
在這裡插入圖片描述

2.vector輸出函數

(1)使用計數器列印vector容器

//方式一:使用計數器列印vector容器
void my_print2(vector<int>&v)
{
	for (unsigned i=0; i<v.size() ; i++)
    std::cout << ' ' << v[i];
}

(2)通過迭代器輸出

//方式二:迭代器列印vector容器 
void my_print(vector<int>&v)
{
	for(vector<int>::iterator it=v.begin();it!=v.end();it++)
	{
		std::cout<<(*it)<<" ";
	}
	std::cout<<endl;
}

(3)使用auto/typedef/type alias

注:這種方法原理就是使用迭代器,auto在這就是指的是迭代器型別

//方式三:使用auto/typedef/type alias
for (auto i = path.begin(); i != path.end(); i++) {
    std::cout << *i << ' ';
}

(4)使用range-base

注:這種方法就是方法三的變形式,同樣是使用迭代器輸出

//方式四:range-base 迴圈
for (auto i : path)
    std::cout << i << ' ';

3.vector的成員函數

(1)vector::assign

函數功能:將新內容分配給vector,替換其當前內容,並相應地修改其大小。

template <class InputIterator>
(1)void assign (InputIterator first, InputIterator last);//新內容是由first和last之間範圍內的每個元素按相同順序構造的元素。
(2)void assign (size_type n, const value_type& val);//新內容是n 個元素,每個元素都初始化為val的副本

舉例程式碼:
在這裡插入圖片描述
結果輸出
在這裡插入圖片描述

(2)vector::at

函數功能:返回對向量中位置n處元素的參照。
舉例程式碼:
在這裡插入圖片描述
結果輸出
在這裡插入圖片描述

(3)vector::back

函數功能:返回對向量中最後一個元素的參照。
與成員vector::end不同,它返回一個剛剛經過這個元素的迭代器,這個函數返回一個直接參照。在空容器上呼叫此函數會導致未定義的行為。
舉例程式碼:
在這裡插入圖片描述
結果輸出
在這裡插入圖片描述

(4)vector::begin

函數功能:返回指向向量中第一個元素的迭代器
例子程式碼
在這裡插入圖片描述
結果輸出
在這裡插入圖片描述

(5)vector::end

函數功能:返回指向向量中最後一個元素的迭代器
例子程式碼在這裡插入圖片描述
結果輸出在這裡插入圖片描述

(6)vector::capacity

函數功能:返回當前為vector分配的儲存空間的大小,以元素表示。
例子程式碼
在這裡插入圖片描述
在這裡插入圖片描述

(6)vector::size

函數功能:返回當前為vector分配的儲存空間的大小,以元素表示。
例子程式碼在這裡插入圖片描述

結果輸出:見(6)

(8)vector::max_size

函數功能:返回當前為vector分配的儲存空間的大小,以元素表示。
例子程式碼在這裡插入圖片描述

結果輸出:見(6)

(9)vector::resize

函數功能:調整容器大小,使其包含n 個元素。
例子程式碼在這裡插入圖片描述
結果輸出
在這裡插入圖片描述

(10)vector::clear

函數功能:從向量中移除所有元素(被銷燬),留下大小為0的容器。
例子程式碼在這裡插入圖片描述
結果輸出在這裡插入圖片描述

(11)vector::push_back

函數功能:在vector的末尾新增一個新元素,在其當前最後一個元素之後。
例子程式碼:見(10)
結果輸出見(10)

(12)vector::pop_back

函數功能:刪除vector 中的最後一個元素,有效地將容器大小減少一。

(13)vector::insert

函數功能:通過在指定的插入元件之前新元素擴充套件位置,有效地增加了容器的尺寸由插入元件的數量。
例子程式碼在這裡插入圖片描述
結果輸出在這裡插入圖片描述

(14)vector::empty

函數功能:返回向量是否為空(即其大小是否為0)。

(15)vector::swap

函數功能:返回當前為vector分配的儲存空間的大小,以元素表示。
例子程式碼在這裡插入圖片描述
結果輸出在這裡插入圖片描述

(16)其他函數

【傳送門】
vector::cbegin
vector::cend
vector::crbegin
vector::crend
vector::data
vector::emplace
vector::emplace_back、
vector::front
vector::get_allocator
vector::operator=
vector::reserve
vector::shrink_to_fit
vector::rend
vector::rbegin
vector::operator[]
vector::erase

附錄

成員型別
在這裡插入圖片描述