C++里的vector詳細講解

在C++的標準模板庫(STL)中,vector是一個非常有用的動態數組容器。它允許我們存儲可變大小的同類型元素序列,并且能夠動態地增長和縮小。由于其靈活性和易用性,vector在C++編程中得到了廣泛的應用。

一、vector的基本操作

1. 包含頭文件

要使用vector,首先需要包含相應的頭文件:

#include <vector>
2. 創建vector對象

創建一個空的int類型的vector

std::vector<int> v;

創建一個包含10個整數的vector,并初始化為0:

std::vector<int> v(10, 0);
3. 添加元素

使用push_back()函數向vector的末尾添加一個元素:

v.push_back(1);
v.push_back(2);
4. 訪問元素

使用下標運算符[]來訪問vector中的元素:

int first_element = v[0];  // 訪問第一個元素
v[1] = 3;  // 修改第二個元素的值為3
5. 刪除元素

使用erase()函數刪除指定位置的元素:

v.erase(v.begin() + 1);  // 刪除第二個元素
6. 遍歷元素

使用迭代器或范圍for循環遍歷vector中的元素:

// 使用迭代器遍歷
for (std::vector<int>::iterator it = v.begin(); it != v.end(); ++it) {std::cout << *it << " ";
}
std::cout << std::endl;// 使用范圍for循環遍歷
for (const auto& element : v) {std::cout << element << " ";
}
std::cout << std::endl;
7. 獲取vector的大小和容量

使用size()函數獲取vector中元素的數量,使用capacity()函數獲取vector當前分配的內存空間能夠容納的元素數量:

std::cout << "Size: " << v.size() << std::endl;
std::cout << "Capacity: " << v.capacity() << std::endl;

二、vector的特點和優勢

  1. 動態擴展:當向vector中添加元素時,如果當前分配的內存空間不足以容納新元素,vector會自動重新分配更大的內存空間,并復制或移動原有元素到新的內存空間。這個過程對用戶是透明的,無需手動管理內存。
  2. 連續存儲vector中的元素在內存中是連續存儲的,這使得訪問和操作元素非常高效。同時,連續存儲也方便了元素的遍歷和查找。
  3. 類型安全vector是模板類,可以存儲任意類型的元素(包括基本數據類型、自定義類型等),并且保證了類型安全。在編譯時會檢查元素的類型,避免了運行時類型錯誤的風險。
  4. 易于使用vector提供了豐富的成員函數和操作符重載,使得對容器的操作更加直觀和方便。例如,可以使用==運算符比較兩個vector是否相等,使用+=運算符向vector中添加元素等。

三、示例代碼

下面是一個簡單的示例代碼,演示了如何使用vector進行基本的操作:

#include <iostream>
#include <vector>int main() {// 創建一個空的int類型的vectorstd::vector<int> v;// 向vector中添加元素v.push_back(1);v.push_back(2);v.push_back(3);// 訪問和修改元素std::cout << "First element: " << v[0] << std::endl;  // 輸出:First element: 1v[1] = 4;  // 修改第二個元素的值為4// 遍歷元素并輸出std::cout << "Elements in vector: ";for (const auto& element : v) {std::cout << element << " ";}std::cout << std::endl;  // 輸出:Elements in vector: 1 4 3 // 刪除第二個元素(現在的值為4的元素)v.erase(v.begin() + 1);// 再次遍歷元素并輸出std::cout << "Elements after deletion: ";for (const auto& element : v) {std::cout << element << " ";}std::cout << std::endl;  // 輸出:Elements after deletion: 1 3 return 0;
}

四、vector的性能考慮

雖然vector提供了很多便利,但在某些情況下,其性能可能并不是最優的。這主要源于vector在動態擴展時可能涉及大量的內存分配和數據復制。以下是一些使用vector時需要考慮的性能因素:

  1. 內存分配和復制:當vector需要增長時,它通常會分配一個更大的內存塊,并將舊元素復制到新位置。這個過程可能很耗時,特別是對于大型vector。因此,如果你知道將要存儲的元素數量,最好提前使用reserve()函數預留足夠的空間。

  2. 連續內存訪問:由于vector的元素在內存中是連續存儲的,因此訪問它們的性能通常很好。然而,插入或刪除元素(特別是在vector的中間)可能會導致大量元素的移動,從而影響性能。在這種情況下,使用其他數據結構(如listdeque)可能更為合適。

  3. 緩存友好性:由于vector的元素是連續存儲的,因此它們更容易被CPU緩存,從而提高訪問速度。但是,當vector變得非常大時,它可能無法完全適應緩存,導致性能下降。

五、高級用法和注意事項

1. 使用emplace_back()避免不必要的復制或移動

當你想在vector的末尾添加一個元素時,如果元素類型是一個復雜的對象,使用emplace_back()而不是push_back()可以避免不必要的復制或移動操作。emplace_back()允許你在容器內直接構造元素,而無需先創建一個臨時對象再將其復制或移動到容器中。

std::vector<std::string> strVec;
strVec.emplace_back("Hello");  // 直接在vector中構造std::string對象
2. 使用reserve()優化性能

如果你知道將要添加到vector中的元素數量,可以使用reserve()函數提前分配足夠的內存空間。這樣可以避免多次重新分配內存和數據復制,從而提高性能。

std::vector<int> intVec;
intVec.reserve(1000);  // 預留空間以存儲1000個整數
for (int i = 0; i < 1000; ++i) {intVec.push_back(i);
}
3. 使用shrink_to_fit()釋放未使用的內存

在刪除大量元素后,vector可能不會立即釋放未使用的內存。你可以調用shrink_to_fit()來請求容器減小其容量以匹配當前的大小。但請注意,這只是一個請求,標準庫并不保證一定會釋放內存。

std::vector<int> intVec(1000);
// ... 使用intVec ...
intVec.clear();  // 清除所有元素
intVec.shrink_to_fit();  // 請求釋放未使用的內存
4. 避免在循環中多次調用size()

在循環中多次調用size()函數可能會導致不必要的性能開銷,特別是當循環體很大且迭代次數很多時。最好將size()的結果存儲在一個變量中,并在循環中使用該變量。

std::vector<int> intVec = {1, 2, 3, 4, 5};
size_t size = intVec.size();
for (size_t i = 0; i < size; ++i) {// ... 使用intVec[i] ...
}

六、總結

vector是C++ STL中非常強大且易于使用的動態數組容器。它提供了靈活的內存管理、高效的元素訪問和豐富的操作函數。然而,在使用vector時,我們也應該注意其性能特點和最佳實踐,以確保代碼的高效運行。通過合理使用vector的成員函數和注意避免一些常見陷阱,我們可以充分利用這個容器的優勢來編寫高效且可靠的C++代碼。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/14846.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/14846.shtml
英文地址,請注明出處:http://en.pswp.cn/web/14846.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Java異常處理:最佳實踐與常見模式

在Java編程中&#xff0c;異常處理是保證程序健壁性和穩定性的重要方面。良好的異常處理不僅可以幫助程序在面對錯誤情況時恢復到正常狀態&#xff0c;還可以提供錯誤診斷的信息&#xff0c;輔助開發者快速定位問題。本文將探討Java中的異常處理機制&#xff0c;包括異常的分類…

esp32 Micropython 長按按鍵動作一次代碼

1. 長按按鍵&#xff0c;松手后動作 from machine import Pin import timeEnter_key Pin(15, Pin.IN, Pin.PULL_UP) Enter_key_flag 0 Enter_key_flag_temp 0while True:if Enter_key.value() 0:time.sleep_ms(10)while Enter_key.value() 0:Enter_key_flag_temp not En…

System.Collections.Generic 中的接口和類型區分

System.Collections.Generic 命名空間包含了許多與泛型集合相關的接口和類。這些接口定義了一組通用的集合行為&#xff0c;而具體的實現&#xff08;如 List、Dictionary<TKey, TValue> 等&#xff09;則遵循這些接口&#xff0c;從而提供具體的集合功能。以下是 System…

前后端開發入門全攻略:零基礎學起

新書上架~&#x1f447;全國包郵奧~ python實用小工具開發教程http://pythontoolsteach.com/3 歡迎關注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目錄 一、前后端開發概覽 二、后端開發基礎&#xff1a;Flask框架入門 代碼案例&#xff1a;Hel…

vue3之使用圖片實現類似于 el-radio 的單選框功能,并且可實現選中和取消選中

背景 我們在工作中常用的一般都是使用類似于 element-plus 中的 el-radio 或者是 el-checkbox 來實現單選或者多選 若有一天我們遇到了一個新的業務需求,需要使用 圖片 來實現類似于 el-radio 的功能,并且要求實現第一次點擊時處于選中狀態,當我們再次點擊時處于非選中狀態…

談戀愛沒經驗?那就來刷談戀愛經驗寶寶吧

??作者主頁&#xff1a;小虛竹 ??作者簡介&#xff1a;大家好,我是小虛竹。2022年度博客之星評選TOP 10&#x1f3c6;&#xff0c;Java領域優質創作者&#x1f3c6;&#xff0c;CSDN博客專家&#x1f3c6;&#xff0c;華為云享專家&#x1f3c6;&#xff0c;掘金年度人氣作…

自動駕駛---Tesla的自動駕駛技術進化史(PerceptionPlanning)

1 前言 筆者在專欄《自動駕駛Planning模塊》中已經詳細講解了傳統自動駕駛Planning模塊的內容&#xff1a;包括行車的Behavior Planning和Motion Planning&#xff0c;以及低速記憶泊車的Planning&#xff08;最開始有15篇&#xff0c;目前逐漸更新到17篇&#xff09;。讀者對整…

【Spring】SSM介紹_SSM整合

1、SSM介紹 1.1簡介 SSM&#xff08;Spring SpringMVC MyBatis&#xff09;整合是一種流行的Java Web應用程序框架組合&#xff0c;它將Spring框架的核心特性、SpringMVC作為Web層框架和MyBatis作為數據訪問層框架結合在一起。這種整合方式提供了從數據訪問到業務邏輯處理再…

5.18 TCP機械臂模擬

#include <netinet/tcp.h>//包含TCP選項的頭文件 #include <arpa/inet.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <linux/input.h>//讀取輸入事件 #include <sys/types.h> #include <sys/stat.h&…

對于mybatis和mybatisplus的選擇

對于mybatis和mybatisplus的選擇 1. 問題2. MP單表操作2.1 單表普通查詢2.2 單表分頁查詢 3. mybatis多表操作3.1 多表普通查詢3.2 多表分頁查詢 1. 問題 mybatis 和 mybatisplus作為當下主流的持久層框架&#xff0c;各有優劣勢。依據個人經驗&#xff1a;mybatis可以定制化輸…

一文詳解邏輯越權漏洞

1. 邏輯越權 1.1. 漏洞原理 邏輯越權漏洞就是當用戶跳過自己的權限限制&#xff0c;去操作同等級用戶或者上級用戶。正常的情況下&#xff0c;當一個用戶去訪問某個資源的時候&#xff0c;首先需要去登錄驗證自己的權限&#xff0c;其次是對數據的查詢&#xff0c;最后返回數…

gateway基本配置,如何配置?

文章推薦 1 作為程序員&#xff0c;開發用過最好用的AI工具有哪些&#xff1f; 2 Github Copilot正版的激活成功&#xff0c;終于可以chat了 3 idea,pycharm等的ai assistant已成功激活 4 新手如何拿捏 Github Copilot AI助手&#xff0c;幫助你提高寫代碼效率 5 Jetbrains的a…

linux命令中arpd的使用

arpd 收集免費ARP信息 補充說明 arpd命令 是用來收集免費arp信息的一個守護進程&#xff0c;它將收集到的信息保存在磁盤上或者在需要時&#xff0c;提供給內核用戶用于避免多余廣播。 語法 arpd(選項)(參數)選項 -l&#xff1a;將arp數據庫輸出到標準輸出設備顯示并退出…

【云原生】Kubernetes----POD基本管理

目錄 引言 一、Pod基礎概念 &#xff08;一&#xff09;Pod簡介 &#xff08;二&#xff09;Pod的分類 1.自主式Pod 2.控制器管理的Pod &#xff08;三&#xff09;Pod使用方式 1.單容器pod 2.多容器Pod 3. 注意事項 二、Pod容器的分類 &#xff08;一&#xff09;…

C#中的惰性對象你使用過嗎?

概述&#xff1a;本文深入探討了 C# 中 Lazy Objects 的概念。惰性對象是高效資源配置和初始化的非常有益的工具&#xff0c;尤其是在這些過程成本高昂或耗時的情況下。它全面研究了 Lazy Objects 的功能、其目的和最佳用例&#xff0c;以及實際的實現策略。延遲加載簡介什么是…

【Unity】免費的高亮插件——QuickOutline

除了常見的HighLightSystem來實現的高亮功能&#xff0c;其實還有很多的方法實現物體的高亮。 在 Unity資源商店 搜索OutLine&#xff0c;就會有很多免費好用的高亮插件。 下面介紹一下 QuickOutline這個插件&#xff0c;在 Unity資源商店 搜索到后&#xff0c;點擊進去就可以…

推薦幾款新手學習編程的網站

免費在線開發平臺 介紹一款編程平臺&#xff0c;專為學生和開發者量身打造&#xff01;平臺擁有近4000道編程題目&#xff0c;支持多種編程語言&#xff08;包括C、C、JavaScript、TypeScript、Go、Rust、PHP、Java、Ruby、Python3和C#&#xff09;&#xff0c;為您提供全面的學…

Tomcat端口配置

Tomcat是開源免費的服務器&#xff0c;其默認的端口為8080&#xff0c;本文講述一下如何配置端口。 最后在瀏覽器中輸入localhost:8888即可打開Tomcat界面

python判斷字符串是否為回文串的詳細解析與實現

新書上架~&#x1f447;全國包郵奧~ python實用小工具開發教程http://pythontoolsteach.com/3 歡迎關注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目錄 一、引言&#xff1a;回文串的定義與背景 二、判斷回文串的基本思路 示例解析 三、代碼實…

三維場景感知之三維目標檢測方向入門

三維目標檢測入門 1 文檔需知2 基礎知識深度學習基礎必上手項目科研研究必知道的論文門戶深度學習必看論文 3 目標檢測入門知識二維目標檢測必看論文 4 三維目標檢測入門知識三維目標檢測必熟悉數據集三維目標檢測點云分類分割預備知識三維目標檢測必熟悉&#xff0c;必跑通&am…