C++之動(dòng)態(tài)數(shù)組vector解讀
在 C++ 編程中,std::vector
是標(biāo)準(zhǔn)模板庫(kù)(STL)中非常重要的容器之一。
它提供了一個(gè)動(dòng)態(tài)數(shù)組的功能,能夠根據(jù)需要自動(dòng)調(diào)整大小,同時(shí)具備高效的內(nèi)存管理和豐富的操作接口。
一、什么是 std::vector?
std::vector
是 C++ STL 中的一種序列容器,它類似于傳統(tǒng)的數(shù)組,但具有動(dòng)態(tài)擴(kuò)展和收縮的能力。
與普通數(shù)組相比,std::vector
的大小可以在運(yùn)行時(shí)動(dòng)態(tài)變化,而普通數(shù)組的大小在定義時(shí)就已經(jīng)確定,無(wú)法改變。
std::vector
的底層實(shí)現(xiàn)是一個(gè)連續(xù)的內(nèi)存塊,這使得它在隨機(jī)訪問(wèn)元素時(shí)非常高效,類似于數(shù)組的訪問(wèn)速度。
二、std::vector 的基本特性
(一)動(dòng)態(tài)擴(kuò)展
std::vector
的最大特點(diǎn)是動(dòng)態(tài)擴(kuò)展。當(dāng)向 std::vector
中添加元素,而當(dāng)前分配的內(nèi)存空間不足以容納更多元素時(shí),std::vector
會(huì)自動(dòng)分配更大的內(nèi)存空間,并將原有元素復(fù)制到新的內(nèi)存中。
這個(gè)過(guò)程雖然涉及到內(nèi)存分配和數(shù)據(jù)復(fù)制,但 std::vector
會(huì)盡量?jī)?yōu)化,通常會(huì)分配比當(dāng)前需要更多的空間,以減少后續(xù)的擴(kuò)展次數(shù)。
(二)隨機(jī)訪問(wèn)
由于 std::vector
的底層是連續(xù)的內(nèi)存塊,因此它支持隨機(jī)訪問(wèn)。
可以通過(guò)下標(biāo)(operator[]
或 at()
)快速訪問(wèn)任意位置的元素,時(shí)間復(fù)雜度為 O(1)。
這使得 std::vector
在需要頻繁隨機(jī)訪問(wèn)元素的場(chǎng)景中非常高效。
(三)內(nèi)存管理
std::vector
會(huì)自動(dòng)管理內(nèi)存。當(dāng)向 std::vector
中添加或刪除元素時(shí),它會(huì)自動(dòng)調(diào)整內(nèi)存的分配和釋放。
此外,std::vector
提供了一些方法來(lái)控制內(nèi)存的分配策略,例如 reserve()
方法可以預(yù)先分配足夠的內(nèi)存,從而減少動(dòng)態(tài)擴(kuò)展的次數(shù),提高性能。
三、std::vector 的基本操作
(一)定義和初始化
std::vector
可以通過(guò)多種方式定義和初始化。
以下是一些常見(jiàn)的定義方式:
#include <vector> // 定義一個(gè)空的 vector std::vector<int> vec1; // 使用初始化列表初始化 std::vector<int> vec2 = {1, 2, 3, 4, 5}; // 使用默認(rèn)值初始化 std::vector<int> vec3(10, 0); // 10個(gè)元素,初始值為0 // 復(fù)制構(gòu)造 std::vector<int> vec4(vec2); // 從另一個(gè) vector 的一部分構(gòu)造 std::vector<int> vec5(vec2.begin() + 1, vec2.end() - 1);
(二)添加和刪除元素
std::vector
提供了多種方法來(lái)添加和刪除元素:
添加元素
push_back()
:在std::vector
的末尾添加一個(gè)元素。insert()
:在指定位置插入一個(gè)或多個(gè)元素。
vec1.push_back(10); // 在末尾添加一個(gè)元素 vec1.insert(vec1.begin() + 2, 20); // 在索引為2的位置插入一個(gè)元素
刪除元素
pop_back()
:刪除std::vector
的最后一個(gè)元素。erase()
:刪除指定位置的一個(gè)或多個(gè)元素。
vec1.pop_back(); // 刪除最后一個(gè)元素 vec1.erase(vec1.begin() + 1); // 刪除索引為1的元素
(三)訪問(wèn)元素
std::vector
提供了多種方式來(lái)訪問(wèn)元素:
operator[]
:通過(guò)下標(biāo)訪問(wèn)元素,不進(jìn)行邊界檢查。at()
:通過(guò)下標(biāo)訪問(wèn)元素,并進(jìn)行邊界檢查,如果超出范圍會(huì)拋出異常。
int value1 = vec1[0]; // 使用下標(biāo)訪問(wèn) int value2 = vec1.at(1); // 使用 at() 訪問(wèn)
(四)遍歷
可以使用迭代器或基于范圍的 for 循環(huán)來(lái)遍歷 std::vector
:
// 使用迭代器遍歷 for (std::vector<int>::iterator it = vec1.begin(); it != vec1.end(); ++it) { std::cout << *it << " "; } // 使用基于范圍的 for 循環(huán) for (int value : vec1) { std::cout << value << " "; }
(五)大小和容量
std::vector
提供了一些方法來(lái)獲取其大小和容量:
size()
:返回當(dāng)前std::vector
中的元素?cái)?shù)量。capacity()
:返回當(dāng)前分配的內(nèi)存容量(以元素?cái)?shù)量為單位)。empty()
:判斷std::vector
是否為空。resize()
:調(diào)整std::vector
的大小。reserve()
:預(yù)先分配內(nèi)存,以減少動(dòng)態(tài)擴(kuò)展的次數(shù)。
std::cout << "Size: " << vec1.size() << std::endl; std::cout << "Capacity: " << vec1.capacity() << std::endl; if (vec1.empty()) { std::cout << "Vector is empty" << std::endl; } vec1.resize(15, 0); // 調(diào)整大小為15,新元素初始化為0 vec1.reserve(20); // 預(yù)先分配20個(gè)元素的內(nèi)存
四、std::vector 的應(yīng)用場(chǎng)景
(一)動(dòng)態(tài)數(shù)組
std::vector
是實(shí)現(xiàn)動(dòng)態(tài)數(shù)組的首選容器。它可以在運(yùn)行時(shí)動(dòng)態(tài)調(diào)整大小,非常適合需要頻繁添加或刪除元素的場(chǎng)景。
例如,在處理動(dòng)態(tài)數(shù)據(jù)集合時(shí),std::vector
可以方便地存儲(chǔ)和管理數(shù)據(jù)。
(二)隨機(jī)訪問(wèn)
由于 std::vector
支持隨機(jī)訪問(wèn),因此在需要頻繁通過(guò)下標(biāo)訪問(wèn)元素的場(chǎng)景中非常高效。
例如,在實(shí)現(xiàn)算法時(shí),經(jīng)常需要通過(guò)下標(biāo)訪問(wèn)數(shù)組中的元素,std::vector
可以很好地滿足這一需求。
(三)內(nèi)存管理
std::vector
提供了靈活的內(nèi)存管理功能。
通過(guò) reserve()
方法可以預(yù)先分配足夠的內(nèi)存,從而減少動(dòng)態(tài)擴(kuò)展的次數(shù),提高性能。
這在處理大量數(shù)據(jù)時(shí)非常有用,可以避免頻繁的內(nèi)存分配和數(shù)據(jù)復(fù)制。
五、注意事項(xiàng)
(一)性能優(yōu)化
雖然 std::vector
會(huì)自動(dòng)管理內(nèi)存,但在某些情況下,手動(dòng)控制內(nèi)存分配可以提高性能。
例如,在知道數(shù)據(jù)量的情況下,可以使用 reserve()
方法預(yù)先分配足夠的內(nèi)存,避免多次動(dòng)態(tài)擴(kuò)展。
(二)內(nèi)存釋放
當(dāng)不再需要 std::vector
時(shí),它會(huì)自動(dòng)釋放分配的內(nèi)存。但如果在程序運(yùn)行過(guò)程中需要釋放內(nèi)存,可以使用 clear()
方法清空 std::vector
,但需要注意的是,clear()
只會(huì)清空元素,不會(huì)釋放內(nèi)存。如果需要釋放內(nèi)存,可以使用 shrink_to_fit()
方法。
(三)異常安全
std::vector
的某些操作可能會(huì)拋出異常,例如 at()
方法在訪問(wèn)超出范圍的元素時(shí)會(huì)拋出 std::out_of_range
異常。在使用這些方法時(shí),需要注意異常處理。
總結(jié)
std::vector
是 C++ STL 中非常重要的容器之一,它結(jié)合了動(dòng)態(tài)數(shù)組的靈活性和數(shù)組的高效性。
通過(guò)動(dòng)態(tài)擴(kuò)展、隨機(jī)訪問(wèn)和靈活的內(nèi)存管理,std::vector
可以滿足多種編程需求。在實(shí)際開(kāi)發(fā)中,合理使用 std::vector
可以提高代碼的可讀性和性能。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
C語(yǔ)言遞歸之漢諾塔和青蛙跳臺(tái)階問(wèn)題
這篇文章主要介紹了C語(yǔ)言遞歸之漢諾塔問(wèn)題和青蛙跳臺(tái)階問(wèn)題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-04-04自己簡(jiǎn)單封裝的一個(gè)CDialog類實(shí)例
這篇文章主要介紹了自己簡(jiǎn)單封裝的一個(gè)CDialog類,實(shí)例分析了自定義封裝CDialog類的相關(guān)技巧,比較簡(jiǎn)單易懂,需要的朋友可以參考下2015-04-04C語(yǔ)言實(shí)現(xiàn)推箱子項(xiàng)目
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)推箱子項(xiàng)目,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-08-08C++實(shí)現(xiàn)LeetCode(121.買(mǎi)賣(mài)股票的最佳時(shí)間)
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(121.買(mǎi)賣(mài)股票的最佳時(shí)間),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07VC外部符號(hào)錯(cuò)誤_main,_WinMain@16,__beginthreadex解決方法
這篇文章主要介紹了VC外部符號(hào)錯(cuò)誤_main,_WinMain@16,__beginthreadex解決方法,實(shí)例分析了比較典型的錯(cuò)誤及對(duì)應(yīng)的解決方法,需要的朋友可以參考下2015-05-05一文帶你掌握C++中的移動(dòng)語(yǔ)義和完美轉(zhuǎn)發(fā)
這篇文章主要為大家詳細(xì)介紹了C++中的移動(dòng)語(yǔ)義和完美轉(zhuǎn)發(fā)的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),對(duì)我們深入掌握C++有一定的幫助,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-12-12