其他 vector 操作詳解(四十)

介紹

除去向 vector 添加元素(如 push_back)之外,vector 還提供了許多其他操作,這些操作大多與 string 的操作類似。通過掌握這些操作,我們可以方便地查詢、修改和比較 vector 中的元素,從而構建靈活、高效的數據結構。下表總結了 vector 支持的一些常見操作:

操作說明
v.empty()如果 v 不包含任何元素,則返回 true;否則返回 false。
v.size()返回 v 中元素的個數,其返回值類型為 vector::size_type。
v.push_back(t)將值為 t 的元素添加到 v 的尾端。
v[n]返回 v 中第 n 個位置上元素的引用,下標從 0 開始。
v1 = v2用 v2 中元素的副本替換 v1 中原有的所有元素。
v1 = {a, b, c, ...}使用列表中元素的副本替換 v1 中原有的所有元素。
v1 == v2 / v1 != v2當且僅當兩個 vector 的元素個數相同且對應位置的元素都相等時,v1 和 v2 才相等。
<, <=, >, >=按字典順序比較兩個 vector,規則與 string 相似:若兩個 vector 在對應位置的元素全部相同,則元素較少者視為較小;否則以第一對不相同元素的比較結果為準。

下面我們依次介紹這些操作及其使用方法。

1. 查詢與修改 vector 中的元素

1.1 empty() 與 size()

  • empty()
    檢查 vector 是否為空。若 vector 沒有任何元素,則返回 true,否則返回 false。

  • size()
    返回 vector 中當前元素的個數。返回類型通常為 vector::size_type,一般為無符號整型。

示例:

#include <iostream>
#include <vector>
using std::vector;
using std::cout;
using std::endl;int main() {vector<int> v;  // 默認初始化為空 vectorif (v.empty())cout << "v is empty." << endl;v.push_back(10);v.push_back(20);cout << "v size: " << v.size() << endl;  // 輸出 v 的元素個數return 0;
}

1.2 訪問元素:下標運算符 []

使用下標運算符([])可以隨機訪問 vector 中指定位置的元素。注意,下標從 0 開始。例如:

#include <iostream>
#include <vector>
using std::vector;
using std::cout;
using std::endl;int main() {vector<int> v = { 1, 2, 3, 4, 5 };cout << "The third element is: " << v[2] << endl; // 輸出 3// 修改元素v[2] = v[2] * v[2]; // 將第三個元素改為其平方cout << "After modification, the third element is: " << v[2] << endl;return 0;
}

注意:
使用下標運算符時必須確保下標在合法范圍內。如果訪問不存在的元素(例如對空 vector 或超出范圍的索引進行操作),將產生未定義行為,這可能引發緩沖區溢出問題。

2. 遍歷 vector 元素

2.1 使用范圍 for 語句

范圍 for 語句可以用來遍歷 vector 中的所有元素。對于只讀操作,直接使用 auto 即可;若需要修改元素,必須使用引用:

只讀遍歷
#include <iostream>
#include <vector>
using std::vector;
using std::cout;
using std::endl;int main() {vector<int> v = {1, 2, 3, 4, 5};// 輸出每個元素for (auto i : v) {cout << i << " ";}cout << endl;return 0;
}
修改元素
#include <iostream>
#include <vector>
using std::vector;
using std::cout;
using std::endl;int main() {vector<int> v = {1, 2, 3, 4, 5};// 將 vector 中每個元素乘以自身for (auto &i : v) {  // 注意:必須使用引用i *= i;}// 輸出修改后的元素for (auto i : v) {cout << i << " ";}cout << endl;return 0;
}

3. vector 對象的比較操作

vector 支持相等性和關系運算符,這些運算符的語義與 string 類似:

  • == 和 !=
    兩個 vector 相等當且僅當它們的元素個數相同且對應位置的元素都相等。
  • <, <=, >, >=
    按字典順序比較兩個 vector。如果兩個 vector 在對應位置上元素完全相同,則較短的 vector 被認為較小;如果存在第一對不相同的元素,則比較該對元素的大小。

示例:

#include <iostream>
#include <vector>
using std::vector;
using std::cout;
using std::endl;int main() {vector<int> v1 = {1, 2, 3};vector<int> v2 = {1, 2, 3};vector<int> v3 = {1, 2, 4};if (v1 == v2)cout << "v1 and v2 are equal." << endl;if (v1 < v3)cout << "v1 is less than v3." << endl;return 0;
}

4. 賦值和替換

vector 支持賦值操作符,用于將一個 vector 的內容替換為另一個 vector 的元素副本:

#include <iostream>
#include <vector>
using std::vector;
using std::cout;
using std::endl;int main() {vector<int> v1 = {1, 2, 3};vector<int> v2 = {4, 5, 6};v1 = v2;  // v1 的元素全部被替換為 v2 的元素cout << "After assignment, v1: ";for (auto i : v1)cout << i << " ";cout << endl;return 0;
}

此外,也可以使用列表初始化對 vector 進行賦值(C++11 起支持):

#include <iostream>
#include <vector>
using std::vector;
using std::cout;
using std::endl;int main() {vector<int> v = {1, 2, 3};v = {7, 8, 9};  // 將 v 中的內容替換為 7, 8, 9 的副本cout << "After list-assignment, v: ";for (auto i : v)cout << i << " ";cout << endl;return 0;
}

5. 關于下標操作的警告

  • 下標運算符只能訪問已存在的元素
    下標形式僅適用于訪問或修改 vector 內已存在的元素,而不能用于添加元素。例如,下面的代碼試圖通過下標訪問空 vector 的元素,將會導致錯誤:

    #include <vector>
    #include <iostream>
    using std::vector;
    using std::cout;
    using std::endl;int main() {vector<int> ivec;  // 空 vector// 下面的操作是錯誤的,因為 ivec 不包含任何元素cout << ivec[0];return 0;
    }
    
  • 添加元素必須使用 push_back 或類似成員函數
    正確的添加方式:

    for (int i = 0; i < 10; ++i)ivec.push_back(i);  // 依次添加元素
    

6. 總結

  • 常用操作:

    • empty()size() 用于檢查 vector 是否為空及獲取元素數量。
    • push_back(t) 用于在 vector 尾端添加一個新元素。
    • 下標運算符 v[n] 用于訪問已存在的元素(注意:僅在保證索引合法時使用)。
    • 賦值操作符和列表初始化可用于替換 vector 中所有元素。
    • 相等性和關系運算符基于字典順序比較 vector 中的元素。
  • 遍歷與修改:

    • 使用范圍 for 循環可以簡潔地遍歷 vector,但若在循環中修改容器大小(如 push_back),應避免使用范圍 for。
    • 對于需要修改元素的操作,建議使用基于引用的范圍 for。
  • 下標訪問的注意事項:

    • 只能訪問已存在的元素,不能用下標直接添加新元素。使用 push_back、insert 等成員函數來添加。

掌握 vector 的這些常用操作,不僅有助于更高效地管理動態數組,還能防止因錯誤訪問元素而引起安全問題(例如緩沖區溢出)。希望這篇全面的講解能幫助你在實際編程中熟練使用 vector。

參考資料

  • cppreference.com 關于 std::vector 的詳細文檔
  • 各大 C++ 編碼規范(如 Google C++ Style Guide)中對容器操作的建議

通過對 vector 其他操作的全面解析,你可以更好地掌握如何查詢、修改和比較 vector 中的元素,從而編寫出既健壯又高效的 C++ 程序。

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

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

相關文章

【Leetcode 每日一題】368. 最大整除子集

問題背景 給你一個由 無重復 正整數組成的集合 n u m s nums nums&#xff0c;請你找出并返回其中最大的整除子集 a n s w e r answer answer&#xff0c;子集中每一元素對 ( a n s w e r [ i ] , a n s w e r [ j ] ) (answer[i], answer[j]) (answer[i],answer[j]) 都應當…

python基礎-13-處理excel電子表格

文章目錄 【README】【13】處理Excel電子表格【13.1】Excel文檔【13.2】安裝openpyxl模塊【13.3】讀取Excel文檔【13.3.1】使用openpyxl模塊打開excel文檔【13.3.2】從工作簿取得工作表【13.3.3】從工作表sheet獲取單元格cell【13.3.5】從表中獲取行和列【13.3.6】工作簿、工作…

ABS函數c++

簡介&#xff1a; abs 函數用于計算一個數的絕對值&#xff0c;在 C 中它繼承自 C 語言的標準庫&#xff0c;其歷史可以追溯到早期的 C 語言發展歷程&#xff0c;以下是詳細介紹&#xff1a; 早期編程語言的需求 在計算機編程的早期階段&#xff0c;處理數學運算就是一項基本…

閉環SOTA!北航DiffAD:基于擴散模型實現端到端自動駕駛「多任務閉環統一」

端到端自動駕駛目前是有望實現完全自動駕駛的一條有前景的途徑。然而&#xff0c;現有的端到端自動駕駛系統通常采用主干網絡與多任務頭結合的方式&#xff0c;但是它們存在任務協調和系統復雜度高的問題。為此&#xff0c;本文提出了DiffAD&#xff0c;它統一了各種駕駛目標并…

整車CAN網絡和CANoe

車載網絡中主要包含有Can網絡,Lin網絡,FlexRay,Most,以太網。 500kbps:500波特率,表示的數據傳輸的速度。表示的是最大的網速傳輸速度。也就是每秒 500kb BodyCan車身Can InfoCan娛樂信息Can 車身CAN主要連接的是ESB電動安全帶 ADB自適應遠光燈等 PTCan動力Can 底盤Can

實戰設計模式之迭代器模式

概述 與上一篇介紹的解釋器模式一樣&#xff0c;迭代器模式也是一種行為設計模式。它提供了一種方法來順序訪問一個聚合對象中的各個元素&#xff0c;而無需暴露該對象的內部表示。簡而言之&#xff0c;迭代器模式允許我們遍歷集合數據結構中的元素&#xff0c;而不必了解這些集…

JVM 垃圾回收器是如何判斷一個對象是否要回收?

JVM 垃圾回收器&#xff08;Garbage Collector&#xff09;需要判斷哪些對象是“垃圾”&#xff0c;即不再被程序使用的對象&#xff0c;以便回收它們占用的內存。JVM 主要使用以下兩種方法來判斷對象是否是垃圾&#xff1a; 1. 引用計數算法 (Reference Counting): 原理&…

kali——httrack

目錄 前言 使用教程 前言 HTTrack 是一款運行于 Kali Linux 系統中的開源網站鏡像工具&#xff0c;它能將網站的頁面、圖片、鏈接等資源完整地下載到本地&#xff0c;構建出一個和原網站結構相似的離線副本。 使用教程 apt install httrack //安裝httrack工具 httrac…

kotlin函數類型

一 函數類型定義 1 定義 函數類型就是 (Int, Int) -> Int 函數類型其實就是將函數的 “參數類型” 和 “返回值類型” 抽象出來 2 示例 &#xff1a; (Int, Int) -> Int 表示接收兩個 Int 參數并返回 Int 的函數類型&#xff1b; (String) -> Unit 表示接收 Strin…

C# Winform 入門(9)之如何封裝并調用dll

封裝dll 首先創建 .Net平臺 類庫 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace _09.Encapsulation_dll {public class Program{/// <summary>/// 求兩個double類型的數值的和/// &l…

前后端分離下,Spring Boot 請求從發起到響應的完整執行流程

以下是前后端分離架構下&#xff0c;Spring Boot 請求從發起到響應的完整執行流程&#xff0c;結合你提出的所有問題&#xff0c;按真實執行順序和職責鏈條重新整理所有核心概念、結構、關鍵類、數據轉換點和典型代碼示例&#xff1a; 一、前端發起請求&#xff08;步驟1-2&…

基于sklearn實現文本摘要思考

和各位小伙伴分享一下使用sklearn進行文本摘要的思考。 第一版本 原理 提取式文本摘要的基本原理是&#xff1a; 將文本分割成句子 計算每個句子的重要性(權重) 選擇權重最高的幾個句子組成摘要 常用的句子權重計算方法&#xff1a; TF-IDF&#xff1a;基于詞頻-逆文檔頻…

OpenHarmony子系統開發 - DFX(三)

OpenHarmony子系統開發 - DFX&#xff08;三&#xff09; 五、HiTraceMeter開發指導 HiTraceMeter概述 簡介 HiTraceMeter在OpenHarmony中&#xff0c;為開發者提供業務流程調用鏈跟蹤的維測接口。通過使用該接口所提供的功能&#xff0c;可以幫助開發者迅速獲取指定業務流…

2025年 能夠有效提升AI的生成質量和邏輯嚴謹性 的通用型系統提示

以下是三個經過精心設計的通用型系統提示&#xff08;System Prompt&#xff09;&#xff0c;能夠有效提升AI的生成質量和邏輯嚴謹性&#xff0c;適用于各類對話、分析和創作場景&#xff1a; Prompt 1 - 專家級分步驗證模式 你是一個具備跨領域知識整合能力的超級AI&#xff…

python爬蟲:小程序逆向實戰教程

根據我之前發表的文章&#xff0c;我們進行延伸實戰https://blog.csdn.net/weixin_64809364/article/details/146981598?spm1001.2014.3001.5501 1. 想要爬取什么小程序&#xff0c;我們進行搜索 2. 找到我們vx小程序的文件地址&#xff0c;我們就可以進行破解 破解步驟強看…

C語言變長數組(VLA)詳解:靈活處理動態數據的利器

引言 在C語言中&#xff0c;傳統的數組大小必須在編譯時確定&#xff0c;這限制了程序處理動態數據的靈活性。C99標準引入的變長數組&#xff08;Variable-Length Array, VLA&#xff09; 打破了這一限制&#xff0c;允許數組長度在運行時動態確定。本文將深入解析VLA的語法、…

串口數據轉換為IP數據

串口數據轉換為IP數據是一種常見的通信技術,用于將傳統的串行設備(如傳感器、控制器等)接入現代的IP網絡。以下是詳細介紹: 1. 轉換原理 串口數據轉換為IP數據的過程涉及硬件和軟件的結合,核心是將串行數據封裝為TCP/IP或UDP/IP數據包,通過網絡傳輸。具體步驟如下: 硬…

client-go如何監聽自定義資源

如何使用 client-go 監聽自定義資源 在 Kubernetes 中使用 client-go 監聽自定義資源&#xff08;Custom Resource&#xff0c;簡稱 CR&#xff09;需要借助 Dynamic Client 或 Custom Informer&#xff0c;因為 client-go 的標準 Clientset 只支持內置資源&#xff08;如 Pod…

C++軟件開發架構

文章目錄 1.全局消息通信MsgHandler.h單元測試(QTest)MsgHandlerUnitTest.hMsgHandlerUnitTest.cpp 2.實例間通信InstMsgHandler.h單元測試InstMsgHandlerUnitTest.hInstMsgHandlerUnitTest.cpp 1.全局消息通信 1. 適用于類與類單個對象實例之間的通信&#xff0c;多個對象需要…

AI Agent設計模式一:Chain

概念 &#xff1a;線性任務流設計 ? 優點&#xff1a;邏輯清晰易調試&#xff0c;適合線性處理流程? 缺點&#xff1a;缺乏動態分支能力 from typing import TypedDictfrom langgraph.graph import StateGraph, END# 定義后續用到的一些變量 class CustomState(TypedDict):p…