C++ :vector的介紹和使用

vector學習時一定要學會查看reference

目錄

前言

一、vector基本概念

1.1vector是什么?

1.2內存管理

二、vector的使用

2.1vector的構造

2.2vector iterator 的使用?

2.3vector 空間增長問題?

2.4vector的元素訪問?

?2.5vector 增刪查改

?總結



前言

在C++編程中,vector ? 是標準模板庫(STL)中最常用的數據結構之一。它是一個封裝了動態大小數組的序列容器,提供了靈活的內存管理方式和高效的元素訪問機制。小編將介紹 ? vector ? 的基本特性、常用操作,幫助你更好地理解和掌握這一強大的工具。


一、vector基本概念

1.1vector是什么?

?vector是表示可變大小數組的序列容器。

  • ?vector就像數組一樣,vector也采用的連續存儲空間來存儲元素。也就是意味著可以采用下標對vector的元素進行訪問,和數組一樣高效。但是又不像數組,它的大小是可以動態改變的,而且它的大小會被容器自動處理
  • 與普通的數組相比, ?vector ? 的大小可以動態變化,能夠根據需要自動擴展或收縮。它通過模板實現,可以存儲任意類型的元素,如整數、浮點數、字符串等。

1.2內存管理

?vector ? 在內部使用動態分配的內存來存儲元素。當向 ? vector ? 中添加元素時,如果當前分配的內存不足以容納新元素, ?vector ? 會自動分配一塊更大的內存,并將原有元素復制到新的內存中。這個過程稱為“擴容”。擴容操作雖然在某些情況下會帶來性能開銷,但 ? vector ? 通過合理的內存分配策略(如每次擴容時將容量加倍)盡量減少了擴容的頻率。


二、vector的使用

2.1vector的構造

?空容器構造函數 (默認構造函數)

構造一個空容器,沒有元素。

#include <iostream>
#include <vector>
using namespace std;
int main ()
{// constructors used in the same order as described above:vector<int> first;                                // 無參構造return 0;
}

?填寫構造函數

構造一個容器n元素。每個元素都是val(如果提供)。

int main ()
{std::vector<int> second (4,100);                       // 構造并初始化n個valreturn 0;
}

范圍構造函數

構造一個包含與范圍一樣多的元素的容器[begin(),end()),與每個元素emplace-構造從該范圍內的相應元素,以相同的順序。

int main ()
{vector<int> second (4,100);                       // vector<int> third (second.begin(),second.end());  // 使用迭代器進行初始化構造return 0;
}

?(迭代器目前可以認為是指針)

?拷貝構造函數

int main ()
{vector<int> second (4,100);                       // four ints with value 100vector<int> third (second.begin(),second.end());  // iterating through secondvector<int> fourth (third);                       //?拷貝構造return 0;
}

?

2.2vector iterator 的使用?

?獲取第一個數據位置的iterator/const_iterator:

獲取最后一個數據的下一個位置的iterator/const_iterator

獲取最后一個數據位置的reverse_iterator

?獲取第一個數據前一個位置的reverse_iterator

?

?

?

?

2.3vector 空間增長問題?

?獲取數據個數:

?

?獲取容量大小:

capacity的代碼在vs和g++下分別運行會發現,vs下capacity是按1.5倍增長的,g++是按2倍增長的。
這個問題經常會考察,不要固化的認為,vector增容都是2倍,具體增長多少是根據具體的需求定義的。vs是PJ版本STL,g++是SGI版本STL。?

?

?判斷是否為空:

?

?改變vector的size:

  • resize 指定的數據個數如果大于當前一段空間上的有效數據個數那么如果不指定數據會使用 0 作為有效數據追加在原數據序列后面,讓有效字符個數變為指定字符個數,并且空間不夠會擴容開空間,如果我們指定了數據則會使用我們指定的數據作為有效數據追加在原數據序列的后面
  • resize指定的數據個數如果小于當前有效數據個數,那么會將有效數據個數修改為指定數據個數,并且底層空間大小保持不變

??

?改變vector的capacity:

reserve只負責開辟空間,如果確定知道需要用多少空間,reserve可以緩解vector增容的代價缺陷問題。

  • reserve 會一次性擴容開空間,如果你預想開的空間大于當前空間大小,那么開好的空間相較于你預期想要開的空間只多不少,reverse一般用于你提前已經預想好開多大空間了,這樣使用reserve進行提前一次性開好空間提高效率,避免多次開空間
  • 如果你預想開的空間小于等于當前空間大小,那么當前空間大小保持不變
int main()
{
vector<int> v;
v.push_back(1);
v.push_back(1);
v.push_back(1);
v.push_back(1);
cout<<v.size();
cout<<v.capacity();
v.resize(10);
cout<<v.size();
v.reserve(10);
cout<<capacity();
return 0;
}

?

2.4vector的元素訪問?

?

?operator[] :用于提供對容器或數組中元素的快速訪問

與 ? at() ? 的區別:

operator[] ?:

? 不進行邊界檢查。如果索引超出范圍,行為是未定義的(可能導致程序崩潰)。

? 返回的是元素的引用,可以直接修改元素的值。

? 性能較高,因為它不進行額外的檢查。

?at() ?:

? 進行邊界檢查。如果索引超出范圍,會拋出 ? std::out_of_range ? 異常。

? 返回的是元素的引用,也可以直接修改元素的值。

? 性能略低于 ? operator[] ?,因為需要進行額外的檢查。

?

front:返回對第一個元素的引用向量。

?

?back:返回對最后一個元素的引用向量。

int main()
{int a[5] = { 1,2,3,4,5 };vector<int> v(a, a + 5);cout << v.at(1) << endl;cout << v.front() << endl;cout << v.back() << endl;return 0;
}

?

?2.5vector 增刪查改

push_back:尾插

int main()
{
vector<int> v;
v.push_back(1);
v.push_back(1);
v.push_back(1);
v.push_back(1);
return 0;
}

?

pop_back:尾刪

int main()
{
vector<int> v;
v.push_back(1);
v.push_back(1);
v.push_back(1);
v.push_back(1);
v.pop_back();return 0;
}

?

insert:在pos位置插入一個值/一個區間/n個值

int main()
{int a[5] = { 1,2,3,4,5 };vector<int> v(a, a + 5);// v=1,2,3,4,5v.insert(v.begin(), 5);//5,1,2,3,4,5for (int e : v){cout << e << ' ';}cout << endl;v.insert(v.begin(), 5 , 1);//1,1,1,1,1,5,1,2,3,4,5for (int e : v){cout << e << ' ';}cout << endl;vector<int> v0(3, 6);v.insert(v.end(), v0.begin(),v0.end());//1,1,1,1,1,5,1,2,3,4,5,6,6,6for (auto e : v){cout << e << ' ';}cout << endl;return 0;
}

?

assign:將要傳入數據的對象的原有的數據清空,再去分派數據

int main()
{string s("hello world");vector<char> v;v.assign(s.begin(), s.end());for (char e : v){cout << e;//"hello world"}cout << endl;v.assign(6,6);for (char e : v){cout << e << ' ';//6,6,6,6,6,6}cout << endl;return 0;
}

?

erase:刪除一個迭代器位置上的值并且返回這個刪除的迭代器的下一個數據的位置的迭代器

注意:由于當前迭代器位置的值已經被刪除,所以當前位置的迭代器位置的值的下一個位置的值會向前頂替當前位置的值,那么下一個數據的值就成了當前位置上的數據,返回的是當前位置的迭代器,但當前位置的迭代器上的值改變了

?

?swap:交換兩個vector的數據空間

int main()
{vector<int> v1(6, 1);vector<int> v2(6, 0);cout << "v1的數據序列為:";//1,1,1,1,1,1for (auto e : v1){cout << e << ' ';}cout << endl;cout << "v2的數據序列為:";//0,0,0,0,0,0for (auto e : v2){cout << e << ' ';}cout << endl << endl;v1.swap(v2);//v1和v2交換了數據空間cout << "v1的數據序列為:";for (auto e : v1){cout << e << ' ';//0,0,0,0,0,0}cout << endl;cout << "v2的數據序列為:";for (auto e : v2){cout << e << ' ';//1,1,1,1,1,1}cout << endl;return 0;
}

?

clear:清空vector類模板實例化出的對象的全部數據

int main()
{vector<int> v1(6, 1);v1.clear();//v1被清空return 0;
}

?總結

vector的使用場景:

  • ?動態數組需求當需要一個大小可動態變化的數組時, ?vector ? 是理想的選擇。它能夠根據元素的添加和刪除自動調整內存分配,避免了手動管理內存的復雜性。
  • 高效的隨機訪問 ?vector ? 支持高效的隨機訪問,通過索引可以快速獲取任意位置的元素。這使得它在需要頻繁隨機訪問元素的場景中非常高效。
  • 與其他STL算法配合 ?vector ? 作為STL容器,能夠無縫地與STL算法(如排序、查找等)配合使用,從而實現復雜的數據處理邏輯。

Vector的注意事項:

  • 雖然 ? vector ? 的擴容策略盡量減少了擴容的頻率,但在某些高頻插入的場景中,擴容仍然可能帶來一定的性能開銷。如果事先知道 ? vector ? 的大致大小,可以通過 ? reserve() ? 方法預先分配足夠的內存,從而避免多次擴容。
  • 迭代器失效在對 ? vector ? 進行插入或刪除操作時,可能會導致迭代器失效。特別是當插入或刪除操作導致內存擴容或收縮時,所有迭代器都會失效。因此,在使用迭代器時需要注意迭代器的有效性。

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

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

相關文章

iOS OC 圖片壓縮

純代碼,不廢話,歡迎copy使用,記得點贊 +(NSData *)imageData:(UIImage *)image maxSize:(int)maxSize{ // 設置最大文件大小(200KB) NSLog(@"執行壓縮方案 期望壓縮目標%dk",maxSize); return [self compressImage:image toMaxSize:maxSize]; } // 主壓縮方…

如何更改 SQLserver 數據庫存儲的位置 想從C盤換到D盤

在 SQL Server 中更改數據庫存儲位置&#xff08;從 C 盤遷移到 D 盤&#xff09;需要通過以下步驟完成&#xff1a;1. 確定數據庫文件的當前位置首先查詢數據庫文件的當前路徑&#xff1a;sqlSELECT name, physical_name AS current_location FROM sys.master_files WHERE dat…

【unitrix】 6.8 加一運算(add_one.rs)

一、源碼 這是一個使用 Rust 類型系統實現二進制數加一操作的代碼。 use crate::number::{O, I, B, Null, Bit, NormalizeIf};/// 類型級加一操作 trait /// /// 為二進制數類型實現加一操作&#xff0c;返回新的類型 pub trait AddOne {/// 加一操作的結果類型type Output;//…

國內Ubuntu訪問不了github、 huggingface等

各位小伙伴們&#xff0c;大家好呀。 大家是不是經常遇到訪問不了github、huggingface的情況呀。 在Ubuntu中可以這樣做。 訪問這個網站網站測速-Ping檢測-Trace查詢-Dig查詢-路由跟蹤查詢-tools.ipip.net&#xff0c; 對于github.com&#xff0c;在這個網站輸入github.com…

「Java EE開發指南」如何用MyEclipse創建企業應用項目?(一)

由于有了項目模型和管理工具&#xff0c;現在可以創建Java EE企業應用程序。在本文中您將了解到&#xff1a; 企業應用項目模型項目組織、依賴關系和類解析 該特性在MyEclipse中可用。 MyEclipse v2025.1離線版下載 1. 企業應用項目模型 MyEclipse提供了一個企業應用程序項…

ubuntu 22.04 pam 模塊設置用戶登錄失敗鎖定

1、ubuntu 22.04 配置方法 /etc/pam.d/common-auth 加到如下行后 # auth [success1 defaultignore] pam_unix.so nullok # 添加如下內容 auth [defaultdie] pam_faillock.so authfail auth sufficient pam_faillock.so authsucc/etc/pam.d/common…

Linux 定時任務全解析:atd 與 crond 的區別及實戰案例(含日志備份 + 時間寫入)

1. atd 和 crond 兩個任務管理程序的區別atd&#xff1a;用于執行一次性的定時任務&#xff0c;即設置任務在某個特定的時間點僅執行一次 &#xff0c;適合處理不需要重復執行的定時操作&#xff0c;比如在未來某個確切時間執行一個腳本、發送一份文件等場景。crond&#xff1a…

iOS加固工具有哪些?項目場景下的組合策略與實戰指南

在如今的iOS項目中&#xff0c;“加固”不僅是單一手段&#xff0c;更是多工具協同應用的過程。不同項目場景對安全要求的側重點不同&#xff0c;需要針對性地組合加固工具&#xff0c;才能最大化兼顧安全性、兼容性與效率。 本文將從常見項目場景出發&#xff0c;分析當下市面…

Xilinx Zynq:一款適用于軟件定義無線電的現代片上系統

摘要——軟件定義無線電可以在通用處理器 (CPU) 上實現&#xff0c;例如基于 PC 的處理器。處理器具有高度靈活性&#xff1a;它不僅可以用來處理數據樣本&#xff0c;還可以控制接收器功能、顯示瀑布圖或運行解調軟件。然而&#xff0c;由于處理速度相對較慢&#xff0c;處理器…

接口黑洞?破!安全堡壘?筑!冰火煉獄?戰!MES7114W終極掌控

在工業4.0加速推進的時代&#xff0c;設備互聯正面臨三大關鍵挑戰&#xff1a;多協議接口的“通信割裂”、極端環境的嚴苛考驗&#xff0c;以及高危場景下的安全紅線。在礦山井下、冶金車間、化工廠區等惡劣環境中&#xff0c;傳統有線方案往往受限于高成本布線、維護困難和環境…

深入理解進程地址空間:虛擬內存與進程獨立性

目錄 引言 虛擬地址空間的本質 關鍵觀察 進程地址空間布局 虛擬內存管理&#xff1a;mm_struct 虛擬內存的優勢 總結 引言 在操作系統中&#xff0c;每個進程都運行在自己的獨立區域中&#xff0c;這個區域就是??進程地址空間??。今天我們就來探討這個看似真實實則虛…

Apache ActiveMQ 任意文件寫入漏洞(CVE-2016-3088)復現利用

漏洞原理 Apache ActiveMQ是Apache軟件基金會所研發的開放源代碼消息中間件&#xff0c;由于ActiveMQ是一個純Java程序&#xff0c;因此只需要操作系統支持Java虛擬機&#xff0c;ActiveMQ便可執行 本漏洞出現在fileserver應用中&#xff0c;漏洞原理其實非常簡單&#xff0c…

谷歌地球與ArcGIS Pro查看三維地形

&#xff08;1&#xff09;Google Earth Web端 通過網站&#xff1a;https://earth.google.com/&#xff0c;進入谷歌地球Web端&#xff0c;可以查看歷史影像、三維地形數據、導入kml文件等。 &#xff08;2&#xff09;ArcGIS Pro查看三維場景 加載3D地形數據&#xff0c;轉…

Day06_C語言網絡編程20250718

01.思維導圖1 什么是 modbus他是一個在工控領域非常好用的通信寫 modbus協議本質上是一個 基于 tcp 協議二次封裝的一個協議 什么叫做基于tcp二次封裝的協議&#xff1a;我們自己寫的pack_t(無論靜態還是動態)&#xff0c;都是屬于二次封裝的協議modbus協議是一種 “主從問答式…

web開發-HTML

web開發——HTML 學習目標&#xff1a;學習HTML的基礎&#xff0c;學會get和post方法區別 一、HTMLHTML是什么&#xff1f; 前端網頁界面開發語言。開發工具 PyCharm、vscodePyCharm個性化設置&#xff08;字體和背景顏色&#xff09; File - setting - appearance - theme&…

主流編程語言全景圖:從Python到Rust的深度解析

2024年編程語言生態報告顯示&#xff0c;全球開發者使用的語言數量已達260&#xff0c;但真正主導行業的不到20種。本文帶你穿透技術迷霧&#xff0c;掌握8大核心語言的本質差異。一、選擇編程語言的黃金標準圖表代碼二、八大主流語言對比解析1. Python - 通用膠水語言特性&…

若依框架下前后端分離項目交互流程詳解

在企業級前后端分離項目開發中&#xff08;如若依RuoYi&#xff09;&#xff0c;前端與后端的數據交互、安全認證、權限校驗、響應處理都是必須關注的重點。本文將以“課程管理列表查詢”為例&#xff0c;詳細梳理整個交互流程&#xff0c;每一步均有解析說明和典型代碼&#x…

cartorgapher的編譯與運行

目錄 cartorgapher的編譯環境 cartorgapher的編譯 cartographer的運行 參數的詳解與調參總結 降低延遲與減小計算量 cartorgapher的編譯環境 系統環境 推薦在ubuntu16.04或者18.04上進行編譯 推薦使用剛裝好的ubuntu系統 將ubuntu的軟件源設置成清華的或者其他的中國境內的…

淺談車載電控和機器人一體化關節電控區別和聯系

類別車載電機關節電機&#xff08;伺服電機)電機PMSM 有軸 永磁體內嵌IPMPMSM&BLDC 永磁體表貼 SPM&#xff0c;轉速不高&#xff0c;減少體積 關節和推桿用無框力矩電機&#xff1a;只有定子和轉子&#xff0c;無軸&#xff0c;無外殼和端蓋&#xff0c;便于和編碼器減速器…

【數據結構】堆(下)+ 二叉樹

上期回顧&#xff1a;【數據結構】樹&#xff08;堆&#xff09;上 一.堆的應用 1.1堆排序&#xff08;向下調整在上一期&#xff09; 向上調整算法建堆&#xff1a; 首先先回顧一下向上調整算法 void AdjustUP(HPDataType* arr, int child) {int parent (child - 1) / 2…