C++之動(dòng)態(tài)數(shù)組vector解讀
在 C++ 編程中,std::vector 是標(biāo)準(zhǔn)模板庫(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)確定,無法改變。
std::vector 的底層實(shí)現(xiàn)是一個(gè)連續(xù)的內(nèi)存塊,這使得它在隨機(jī)訪問元素時(shí)非常高效,類似于數(shù)組的訪問速度。
二、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è)過程雖然涉及到內(nèi)存分配和數(shù)據(jù)復(fù)制,但 std::vector 會(huì)盡量優(yōu)化,通常會(huì)分配比當(dāng)前需要更多的空間,以減少后續(xù)的擴(kuò)展次數(shù)。
(二)隨機(jī)訪問
由于 std::vector 的底層是連續(xù)的內(nèi)存塊,因此它支持隨機(jī)訪問。
可以通過下標(biāo)(operator[] 或 at())快速訪問任意位置的元素,時(shí)間復(fù)雜度為 O(1)。
這使得 std::vector 在需要頻繁隨機(jī)訪問元素的場景中非常高效。
(三)內(nèi)存管理
std::vector 會(huì)自動(dòng)管理內(nèi)存。當(dāng)向 std::vector 中添加或刪除元素時(shí),它會(huì)自動(dòng)調(diào)整內(nèi)存的分配和釋放。
此外,std::vector 提供了一些方法來控制內(nèi)存的分配策略,例如 reserve() 方法可以預(yù)先分配足夠的內(nèi)存,從而減少動(dòng)態(tài)擴(kuò)展的次數(shù),提高性能。
三、std::vector 的基本操作
(一)定義和初始化
std::vector 可以通過多種方式定義和初始化。
以下是一些常見的定義方式:
#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 提供了多種方法來添加和刪除元素:
添加元素
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的元素
(三)訪問元素
std::vector 提供了多種方式來訪問元素:
operator[]:通過下標(biāo)訪問元素,不進(jìn)行邊界檢查。at():通過下標(biāo)訪問元素,并進(jìn)行邊界檢查,如果超出范圍會(huì)拋出異常。
int value1 = vec1[0]; // 使用下標(biāo)訪問 int value2 = vec1.at(1); // 使用 at() 訪問
(四)遍歷
可以使用迭代器或基于范圍的 for 循環(huán)來遍歷 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 提供了一些方法來獲取其大小和容量:
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)用場景
(一)動(dòng)態(tài)數(shù)組
std::vector 是實(shí)現(xiàn)動(dòng)態(tài)數(shù)組的首選容器。它可以在運(yùn)行時(shí)動(dòng)態(tài)調(diào)整大小,非常適合需要頻繁添加或刪除元素的場景。
例如,在處理動(dòng)態(tài)數(shù)據(jù)集合時(shí),std::vector 可以方便地存儲(chǔ)和管理數(shù)據(jù)。
(二)隨機(jī)訪問
由于 std::vector 支持隨機(jī)訪問,因此在需要頻繁通過下標(biāo)訪問元素的場景中非常高效。
例如,在實(shí)現(xiàn)算法時(shí),經(jīng)常需要通過下標(biāo)訪問數(shù)組中的元素,std::vector 可以很好地滿足這一需求。
(三)內(nèi)存管理
std::vector 提供了靈活的內(nèi)存管理功能。
通過 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)行過程中需要釋放內(nèi)存,可以使用 clear() 方法清空 std::vector,但需要注意的是,clear() 只會(huì)清空元素,不會(huì)釋放內(nèi)存。如果需要釋放內(nèi)存,可以使用 shrink_to_fit() 方法。
(三)異常安全
std::vector 的某些操作可能會(huì)拋出異常,例如 at() 方法在訪問超出范圍的元素時(shí)會(huì)拋出 std::out_of_range 異常。在使用這些方法時(shí),需要注意異常處理。
總結(jié)
std::vector 是 C++ STL 中非常重要的容器之一,它結(jié)合了動(dòng)態(tài)數(shù)組的靈活性和數(shù)組的高效性。
通過動(dòng)態(tài)擴(kuò)展、隨機(jī)訪問和靈活的內(nèi)存管理,std::vector 可以滿足多種編程需求。在實(shí)際開發(fā)中,合理使用 std::vector 可以提高代碼的可讀性和性能。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
c++實(shí)現(xiàn)值機(jī)系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了c++實(shí)現(xiàn)在線值機(jī)系統(tǒng)程序,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03
C# interface與delegate效能比較的深入解析
本篇文章是對C#中interface與delegate的效能比較進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05
C++實(shí)現(xiàn)LeetCode(241.添加括號的不同方式)
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(241.添加括號的不同方式),本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07
C++?this原理與可變參數(shù)及友元函數(shù)友元類分步詳解用法
可變參數(shù)模板(variadic?templates)是C++11新增的強(qiáng)大的特性之一,它對模板參數(shù)進(jìn)行了高度泛化,能表示0到任意個(gè)數(shù)、任意類型的參數(shù),這篇文章主要介紹了C++?this原理與可變參數(shù)及友元函數(shù)友元類2022-11-11
數(shù)據(jù)結(jié)構(gòu) 紅黑樹的詳解
這篇文章主要介紹了數(shù)據(jù)結(jié)構(gòu) 紅黑樹的詳解的相關(guān)資料,數(shù)據(jù)結(jié)構(gòu)中的二叉樹查找,紅黑樹的講解,需要的朋友可以參考下2017-07-07

