欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++之動(dòng)態(tài)數(shù)組vector解讀

 更新時(shí)間:2025年06月03日 10:02:54   作者:zzh_zao  
這篇文章主要介紹了C++之動(dòng)態(tài)數(shù)組vector解讀,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

在 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ǔ)言遞歸之漢諾塔和青蛙跳臺(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í)例

    這篇文章主要介紹了自己簡(jiǎn)單封裝的一個(gè)CDialog類,實(shí)例分析了自定義封裝CDialog類的相關(guān)技巧,比較簡(jiǎn)單易懂,需要的朋友可以參考下
    2015-04-04
  • C語(yǔ)言實(shí)現(xiàn)推箱子項(xiàng)目

    C語(yǔ)言實(shí)現(xiàn)推箱子項(xiàng)目

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)推箱子項(xiàng)目,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-08-08
  • Qt QML使用虛擬鍵盤(pán)的示例代碼

    Qt QML使用虛擬鍵盤(pán)的示例代碼

    這篇文章主要為大家詳細(xì)介紹了Qt QML使用虛擬鍵盤(pán)的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-01-01
  • C++實(shí)現(xiàn)LeetCode(121.買(mǎi)賣(mài)股票的最佳時(shí)間)

    C++實(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-07
  • Dev C++ 安裝及使用方法(圖文教程)

    Dev C++ 安裝及使用方法(圖文教程)

    Dev C++ 是一款非常好用,簡(jiǎn)約的C/C++開(kāi)發(fā)工具,本文主要介紹了Dev C++ 安裝及使用方法(圖文教程),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • VC外部符號(hào)錯(cuò)誤_main,_WinMain@16,__beginthreadex解決方法

    VC外部符號(hào)錯(cuò)誤_main,_WinMain@16,__beginthreadex解決方法

    這篇文章主要介紹了VC外部符號(hào)錯(cuò)誤_main,_WinMain@16,__beginthreadex解決方法,實(shí)例分析了比較典型的錯(cuò)誤及對(duì)應(yīng)的解決方法,需要的朋友可以參考下
    2015-05-05
  • Qt中QCommandLinkButton控件的使用

    Qt中QCommandLinkButton控件的使用

    QCommandLinkButton 是 Qt 框架中 QtWidgets 模塊的一個(gè)類,它提供了一個(gè)結(jié)合了文本標(biāo)簽和按鈕功能的控件,本文主要介紹了Qt中QCommandLinkButton控件的使用,感興趣的可以了解一下
    2025-04-04
  • C++11異步與通信之std::async的使用

    C++11異步與通信之std::async的使用

    std::async 異步運(yùn)行一個(gè)函數(shù),將返回值保存在std::future中,本文主要介紹了C++11異步與通信之std::async的使用,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-08-08
  • 一文帶你掌握C++中的移動(dòng)語(yǔ)義和完美轉(zhuǎn)發(fā)

    一文帶你掌握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

最新評(píng)論