【C++】vector常見的使用方式

前言:在上一篇中我們講到了string類的模擬實現,今天我們將進一步的去學習vector的一些常用的使用方法。

💖 博主CSDN主頁:衛衛衛的個人主頁 💞
👉 專欄分類:高質量C++學習 👈
💯代碼倉庫:衛衛周大胖的學習日記💫
💪關注博主和博主一起學習!一起努力!
在這里插入圖片描述


目錄標題

  • 什么是vector
  • vector的使用
    • vector構造函數的使用
    • vector常見函數的使用
      • 迭代器的使用
      • rebegin()和rend()函數
      • push_back():在向量的末尾添加一個元素
      • pop_back():刪除向量的最后一個元素
      • size():返回向量中元素的個數
      • empty():檢查向量是否為空,如果為空則返回 true,否則返回 false
      • capacity()
      • clear():清空向量中的所有元素
      • front():返回向量的第一個元素
      • back():返回向量的最后一個元素
      • insert():在指定位置插入一個或多個元素
      • erase():刪除指定位置或指定范圍的元素
      • resize():調整向量的大小
      • swap():交換兩個向量的內容
      • vector中operator[]
    • vector中嵌套vector的二維矩陣或多維數組

什么是vector

在C++中,vector是一種動態數組容器,可以存儲一系列具有相同數據類型的元素。它提供了一些操作函數,如插入、刪除、訪問等,使得對數組進行操作更加方便和靈活。

與普通的數組相比,vector具有以下優點:

  1. 可以在運行時動態調整大小,不需要事先指定大小;
  2. 可以自動處理內存分配和釋放,減少手動管理內存的工作量;
  3. 提供了更多的操作函數,如插入、刪除、查找等;
  4. 可以通過下標訪問元素。

vector的使用

vector構造函數的使用

  1. 默認構造函數
vector<int> vec; // 創建一個空的整數向量
  1. 帶有初始值的構造函數:
int main()
{//vector<int> vec; // 創建一個空的整數向量int n = 0,value = 0;cout << "輸入元素個數" << endl;cin >> n;vector<int> vec(n); // 創建一個包含 n 個默認初始化的整數元素的向量for (auto e : vec)//遍歷容器中的值{cout << e << " ";}cout << endl;cout << "輸入元素的值" << endl;cin >> value;vector<int> vec1(n, value); // 創建一個包含 n 個值為 value 的整數元素的向量for (auto e : vec1)//遍歷容器中的值{cout << e << " ";}cout << endl;return 0;
}

在這里插入圖片描述

  1. 復制構造函數
int main()
{vector<int> vec1 = { 1, 2, 3, 4, 5 }; // 創建一個包含初始元素的向量vector<int> vec2(vec1); // 使用 vec1 的副本創建向量 vec2for (auto s : vec2){cout << s << " ";}cout << endl;return 0;
}

在這里插入圖片描述
4. 列表初始化 (C++11 及以上版本)

int main()
{vector<int> vec4{ 1, 2, 3, 4, 5 }; // 使用列表初始化創建向量 vec4for (auto s : vec4){cout << s << " ";}return 0;
}

在這里插入圖片描述

  1. 區間構造函數
int main()
{vector<int> vec1 = { 1, 2, 3, 4, 5 }; // 創建一個包含初始元素的向量vector<int> vec2(vec1); // 使用 vec1 的副本創建向量 vec2for (auto s : vec2){cout << s << " ";}cout << endl;vector<int> vec3(vec1.begin(), vec1.end()); // 使用迭代器指定區間來創建向量 vec3for (auto s : vec3){cout << s << " ";}return 0;
}

在這里插入圖片描述


vector常見函數的使用

迭代器的使用

在C++中,vector類提供了**begin()end()**成員函數來獲取指向容器中第一個元素和最后一個元素之后位置的迭代器。

調用begin()函數會返回一個指向容器中第一個元素的迭代器。調用end()函數會返回一個指向容器中最后一個元素之后位置的迭代器。

int main() 
{std::vector<int> vec = { 1, 2, 3, 4, 5 };// 使用begin()函數獲取指向第一個元素的迭代器std::vector<int>::iterator it_begin = vec.begin();// 使用end()函數獲取指向最后一個元素之后位置的迭代器std::vector<int>::iterator it_end = vec.end();// 使用迭代器遍歷vector并輸出所有元素for (std::vector<int>::iterator it = it_begin; it != it_end; ++it) {std::cout << *it << " ";}return 0;
}

在這里插入圖片描述


rebegin()和rend()函數

在使用vector中的rbegin()rend()函數時,請按照以下步驟進行操作:

  1. 在代碼中包含<vector>頭文件。
  2. 創建一個vector對象并向其中添加元素。
  3. 使用rbegin()函數獲取指向向量最后一個元素的迭代器。
  4. 使用rend()函數獲取指向向量中第一個元素之前位置的迭代器。
  5. 使用循環以逆序的方式遍歷向量,從rbegin()函數返回的迭代器開始,到rend()函數返回的迭代器結束。

下面是一個示例來說明用法:

#include <iostream>
#include <vector>int main() {std::vector<int> myVec = {1, 2, 3, 4, 5};// 以逆序的方式遍歷向量for (auto it = myVec.rbegin(); it != myVec.rend(); ++it) {std::cout << *it << " ";}std::cout << std::endl;return 0;
}

輸出結果:

5 4 3 2 1

在這個例子中,我們創建了一個名為myVecvector對象,并用一些整數值進行了初始化。然后,我們使用for循環和一個逆序迭代器(rbegin()函數)和一個普通迭代器(rend()函數)來以逆序的方式打印向量的元素。

push_back():在向量的末尾添加一個元素

int main()
{vector<int> vec;vec.push_back(10); // 向 vec 中添加元素 10vec.push_back(20); // 向 vec 中添加元素 20vec.push_back(20); // 向 vec 中添加元素 20vec.push_back(0); // 向 vec 中添加元素 20for (auto e : vec){cout << e << " ";}cout << endl;return 0;
}

在這里插入圖片描述


pop_back():刪除向量的最后一個元素

int main()
{vector<int> vec = { 10, 20, 30,40,50 };cout << "刪除前" << endl;for (auto e : vec){cout << e << " ";}cout << endl;cout << "刪除后" << endl;vec.pop_back(); // 刪除 vec 的最后一個元素for (auto e : vec){cout << e << " ";}cout << endl;return 0;
}

在這里插入圖片描述


size():返回向量中元素的個數

int main()
{vector<int> vec = { 10, 20, 30 };cout <<"該容器的元素個數是: " << vec.size() << endl;return 0;
}

在這里插入圖片描述


empty():檢查向量是否為空,如果為空則返回 true,否則返回 false

int main()
{vector<int> vec = { 1,2 };bool isEmpty = vec.empty(); // 返回 true,因為 vec 是空的if (isEmpty){cout << "該容器是空的" << endl;}else{cout << "該容器不是空的" << endl;}return 0;
}

在這里插入圖片描述


capacity()

在使用vectorcapacity()函數時,它返回的是vector當前分配的內存容量大小,即可以容納的元素數量。以下是使用capacity()函數的幾個常見情況:

  1. 獲取vector的容量:使用capacity()函數可以獲取當前vector的容量。
#include <iostream>
#include <vector>int main() {std::vector<int> myVec;std::cout << "Vector capacity: " << myVec.capacity() << std::endl;return 0;
}

輸出結果:

Vector capacity: 0

在這個例子中,我們創建了一個名為myVec的空vector對象,并使用capacity()函數獲取其容量。由于vector是空的,所以容量為0。

  1. 預分配容量:有時候可以使用reserve()函數來預分配vector的容量,以減少不必要的重新分配的次數。
#include <iostream>
#include <vector>int main() {std::vector<int> myVec;myVec.reserve(10);  // 預分配10個元素的容量std::cout << "Vector capacity: " << myVec.capacity() << std::endl;return 0;
}

輸出結果:

Vector capacity: 10

在這個例子中,我們使用reserve()函數預分配了10個元素的容量,然后使用capacity()函數獲取當前容量。

  1. 動態調整容量:vector會根據需要自動調整容量,以適應元素的添加和刪除。當vector的元素數量超過當前容量時,會自動增加容量以容納更多元素。
#include <iostream>
#include <vector>int main() {std::vector<int> myVec;std::cout << "Initial capacity: " << myVec.capacity() << std::endl;for (int i = 0; i < 10; ++i) {myVec.push_back(i);std::cout << "Vector capacity after adding " << i << ": " << myVec.capacity() << std::endl;}return 0;
}

輸出結果:

Initial capacity: 0
Vector capacity after adding 0: 1
Vector capacity after adding 1: 2
Vector capacity after adding 2: 4
Vector capacity after adding 3: 4
Vector capacity after adding 4: 8
Vector capacity after adding 5: 8
Vector capacity after adding 6: 8
Vector capacity after adding 7: 8
Vector capacity after adding 8: 16
Vector capacity after adding 9: 16

在這個例子中,我們創建了一個名為myVec的空vector對象,并使用capacity()函數獲取初始容量。然后,我們使用push_back()函數向vector添加元素,并使用capacity()函數獲取每次添加元素后的容量。可以看到,當元素數量超過當前容量時,vector會動態調整容量以容納更多元素,容量的增長規律可能是指數級的(取決于編譯器)。


clear():清空向量中的所有元素

int main()
{vector<int> vec = { 10, 20, 30 };cout << "清空前" << endl;for (auto e : vec){cout << e << " ";}cout << endl;cout <<"該容器的元素個數是:" << vec.size() << endl;//查看容器中元素個數vec.clear(); // 清空 vec 中的所有元素cout << "清空后" << endl;for (auto e : vec){cout << e << " ";}cout << endl;cout << "該容器的元素個數是:" << vec.size() << endl;//查看容器中元素個數return 0;
}

在這里插入圖片描述


front():返回向量的第一個元素

int main()
{vector<int> vec = { 10, 20, 30 };int firstElement = vec.front(); // 返回 10cout << firstElement << endl;return 0;
}

在這里插入圖片描述


back():返回向量的最后一個元素

int main()
{vector<int> vec = { 10, 20, 30 };int lastElement = vec.back(); // 返回 30cout << lastElement << endl;return 0;
}

在這里插入圖片描述


insert():在指定位置插入一個或多個元素

int main()
{vector<int> vec = { 10, 20, 30 };vec.insert(vec.begin() + 1, 15); // 在索引為 1 的位置插入元素 15,vec 變為 {10, 15, 20, 30}for (auto e: vec){cout << e << " ";}return 0;
}

在這里插入圖片描述


erase():刪除指定位置或指定范圍的元素

int main()
{vector<int> vec = { 10, 20, 30 ,40, 50};vec.erase(vec.begin() + 1);vec.erase(vec.begin(), vec.begin() + 2); for (auto e: vec){cout << e << " ";}cout << endl;return 0;
}

在這里插入圖片描述


resize():調整向量的大小

int main()
{vector<int> vec = { 10, 20, 30 };vec.resize(5); // 將 vec 調整為包含 5 個元素,未指定的元素將被默認初始化for (auto e: vec){cout << e << " ";}cout << endl;vector<int> vec1 = { 10, 20, 30 };vec1.resize(10, 9);//將vec1調整成10個元素,未被指定的元素 初始化成9for (auto e : vec1){cout << e << " ";}cout << endl;return 0;
}

在這里插入圖片描述


swap():交換兩個向量的內容

int main()
{vector<int> vec1 = { 10, 20 };vector<int> vec2 = { 30, 40 };cout << "交換前" << endl;for (auto e : vec1){cout << e << " ";}vec1.swap(vec2); // 交換 vec1 和 vec2 的元素,vec1 變為 {30, 40},vec2 變為 {10, 20}cout << endl;cout << "交換后" << endl;for (auto e : vec1){cout << e << " ";}
}

在這里插入圖片描述


vector中operator[]

在C++的vector中,operator[]是用于訪問并操作vector中的元素的重載運算符。它允許您使用索引來訪問和修改vector中的特定元素。以下是對operator[]的使用示例:

#include <iostream>
#include <vector>int main() {std::vector<int> myVec = {1, 2, 3, 4, 5};// 通過使用索引來訪問和修改元素std::cout << "Element at index 2: " << myVec[2] << std::endl;myVec[3] = 10;std::cout << "Modified element at index 3: " << myVec[3] << std::endl;return 0;
}

輸出結果:

Element at index 2: 3
Modified element at index 3: 10

在這個例子中,我們創建了一個名為myVecvector對象,并使用初始化列表初始化其元素。然后,我們使用operator[]來訪問索引為2和3的元素,并分別輸出它們的值。接下來,我們將索引為3的元素修改為10,并再次使用operator[]訪問并輸出修改后的值。

需要注意的是,operator[]沒有邊界檢查,如果使用超出vector有效索引范圍的索引進行訪問,會導致未定義的行為。因此,在使用operator[]時,務必確保所使用的索引在vector的有效范圍內。

此外,還可以將operator[]用于循環遍歷vector中的元素:

#include <iostream>
#include <vector>int main() {std::vector<int> myVec = {1, 2, 3, 4, 5};// 使用operator[]遍歷vector中的元素for (size_t i = 0; i < myVec.size(); ++i) {std::cout << "Element at index " << i << ": " << myVec[i] << std::endl;}return 0;
}

輸出結果:

Element at index 0: 1
Element at index 1: 2
Element at index 2: 3
Element at index 3: 4
Element at index 4: 5

在這個例子中,我們使用operator[]在循環中遍歷vector中的元素。通過遞增索引變量i,我們可以依次訪問vector中的元素,并輸出它們的索引和值。


vector中嵌套vector的二維矩陣或多維數組

在C++中,可以使用vector嵌套vector來創建二維矩陣或多維數組。這種嵌套的vector可以用于存儲和訪問多個行和列的數據。

int main() {// 定義數組的大小int rows = 3;int cols = 4;// 創建一個二維vectorstd::vector<std::vector<int>> matrix(rows, std::vector<int>(cols));// 對二維vector進行賦值int count = 1;for (int i = 0; i < rows; i++) {for (int j = 0; j < cols; j++) {matrix[i][j] = count++;}}// 打印二維vector的內容for (int i = 0; i < rows; i++) {for (int j = 0; j < cols; j++) {std::cout << matrix[i][j] << " ";}std::cout << std::endl;}return 0;
}

在這里插入圖片描述


好啦,今天的內容就到這里啦,下期內容預告vector的常見函數模擬實現,博主前段時間有點事情,后面這段時間會加班加點的更新!


結語:今天的內容就到這里吧,謝謝各位的觀看,如果有講的不好的地方也請各位多多指出,作者每一條評論都會讀的,謝謝各位。


🌏🗺? 這里祝各位接下來的每一天好運連連 💞💞

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

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

相關文章

命運方舟臺服注冊 命運方舟臺服怎么注冊?不會操作看這里

命運方舟臺服注冊 命運方舟臺服怎么注冊&#xff1f;不會操作看這里 命運方舟作為今年備受矚目的一款MMORPG類型游戲&#xff0c;在上線前的預約數量已經一次又一次創下新高。這款游戲的開發商Smile gate真是給玩家們帶來了一款讓人眼前一亮的作品。游戲創建在虛幻引擎的基礎…

USACO 2019 December Contest, BronzeProblem 2. Where Am I? 題解

這道題目通過例子可以看出查找最長的相同子串&#xff0c;下一個長度如果沒有找到相同的子串就是結果&#xff0c;需要寫三個循環&#xff0c;第一個循環是是否存在長度為len的相同子串&#xff0c;第二個循環是從左往右截取長度為len的子串&#xff0c;第三個循環的條件是j<…

用esp prog燒錄ESP32-C3板踩坑

附ESP32C3的GPIO一覽&#xff1a; vscode選擇Jtag燒錄&#xff0c;終端輸出esp_usb_jtag: could not find or open device&#xff1a; D:\Devtools\Espressif\tools\openocd-esp32\v0.12.0-esp32-20230921\openocd-esp32\bin\openocd.exe -f board/esp32s3-builtin.cfgOpen O…

【電路筆記】-帶阻濾波器

帶阻濾波器 文章目錄 帶阻濾波器1、概述2、典型帶阻濾波器配置3、帶阻濾波器示例14、陷波濾波器5、帶阻濾波器示例26、總結帶阻濾波器也稱為陷波濾波器,阻止并拒絕位于其兩個截止頻率點之間的頻率,并傳遞該范圍兩側的所有這些頻率。 1、概述 通過將基本 RC 低通濾波器與 RC …

Docker基礎命令(三)

同步docker容器中的時間和本地時間一致 背景: 在很多時候, 訓練模型的時候, 記錄的log日志中標記的時間和實際的時間不一致, 往往是容器時間和本地時間不一致照成的. 方案 場景一: 正在運行的容器&#xff0c;可以宿主機直接執行命令給某個容器同步時間 #方法1 直接在宿主機…

ElasticSearch教程(詳解版)

本篇博客將向各位詳細介紹elasticsearch&#xff0c;也算是對我最近學完elasticsearch的一個總結&#xff0c;對于如何在Kibana中使用DSL指令&#xff0c;本篇文章不會進行介紹&#xff0c;這里只會介紹在java中如何進行使用&#xff0c;保證你看完之后就會在項目中進行上手&am…

Arduino燒錄esp8266

default_encoding: cp936 Assume aggressive ‘core.a’ caching enabled. Note: optional global include file ‘arduino_modified_sketch_764314\Blink.ino.globals.h’ does not exist. Read more at https://arduino-esp8266.readthedocs.io/en/latest/faq/a06-global-bui…

【計劃】裝修相關感想

計劃 Summary 從去年年底開始規劃、設計、落實家里的裝修&#xff0c;2024年4月正式開始裝修&#xff0c;一個人探索和學習了很多知識和概念。 準備把這些東西做一些記錄和分享&#xff0c;一方面記錄一些裝修的流程和中間的小細節便于第二次裝修的時候避免&#xff1b;另一方…

Android設備實時監控藍牙的連接、配對、開關3種狀態

一、簡介 Android設備&#xff0c;需要實時監控本機藍牙連接其他藍牙設備的狀態&#xff0c;包含&#xff1a;連接、配對、開關3種狀態。本文介紹了2種方法&#xff0c;各有優勢&#xff0c;下面來到我的Studio一起瞅瞅吧~ 二、定時器任務 Handler 功能方法 定時器任務 Hand…

寫字靜不下心?不如試試這些“笨方法”

夏天悄悄熱起來啦&#xff5e;有人說&#xff0c;想踏踏實實寫一會兒&#xff0c;但又靜不下心&#xff0c;耐不住性子&#xff0c;快收下這四個小錦囊&#xff0c;與古人一起笨拙精進吧&#xff01;    1、不論輸贏      每次課前&#xff0c;暄桐林曦老師總會強調&am…

AlloyTeam Web前端大會:深入探索前端的無限可能

AlloyTeam Web前端大會&#xff1a;深入探索前端的無限可能 在數字化浪潮的推動下&#xff0c;Web前端技術日新月異&#xff0c;成為引領行業發展的重要力量。AlloyTeam Web前端大會作為業界的盛會&#xff0c;匯聚了眾多前端領域的精英&#xff0c;共同探討前端的未來發展趨勢…

內網-win1

一、概述 1、工作組&#xff1a;將不同的計算機按功能(或部門)分別列入不同的工作組 (1)、查看&#xff08;windows&#xff09; 查看當前系統中所有用戶組&#xff1a;打開命令行--》net localgroup查看組中用戶&#xff1a;打開命令行 --》net localgroup 后接組名查看用戶…

FreeRTOS任務調度機制(源碼講解)

任務的調度機制(核心是鏈表)&#xff01;&#xff01;&#xff01; 使用鏈表來管理任務 在我前面寫的FreeRTOS任務(深入到源碼進行分析)&#xff0c;我創建了三個任務&#xff0c;他們的優先級都是一樣的&#xff0c;所以他們在FreeRTOS中是輪流執行的&#xff0c;實際上&…

19.1 簡易抽獎

準備一個數組&#xff0c;里面添加10個獎品數據&#xff0c;讓獎品數據快速的在盒子中隨機顯示&#xff0c;通過按鈕控制盒子里面的內容停止。 效果圖&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8">&…

解釋Python中的PEP 8是什么 為什么它很重要

PEP 8 是 Python 的一個編碼規范&#xff0c;也稱為 Python 增強提案 8。它提供了一系列關于如何編寫清晰、一致的 Python 代碼的指導原則。這些原則涵蓋了代碼布局、命名約定、注釋、文檔字符串、編碼建議、導入語句、異常、全局變量、嵌套等方面。 為什么PEP 8很重要&#x…

npm install pubsub-js報錯的解決匯總

我在練習谷粒商城P83時&#xff0c;選擇分類時觸發向后端請求選擇分類catId綁定的品牌數據&#xff0c;發現前端控制臺報錯&#xff1a; "PubSub is not definded",找不到pubsub。 因為缺少pubsub包&#xff0c;所以開始安裝此包。 于是在網上一頓搜索猛如虎&…

xilinx ip自帶XDC只讀

檢查生成的IP核再目錄下顯示的文件類型是不是.xcix 如果是的話&#xff0c;重新生成為.xci 再二次編輯即可 或者 將框柱的部分不選擇&#xff0c;從新生成

MongoDB CRUD操作:批量寫操作

MongoDB CRUD操作&#xff1a;批量寫操作 文章目錄 MongoDB CRUD操作&#xff1a;批量寫操作關于批量操作的順序bulkWrite()支持的方法舉例向分片集合批量插入的策略預分割集合無序寫入 mongos避免單調節流 MongoDB提供了批量執行寫入操作的能力&#xff0c;但批量寫入操作只影…

《計算機工程與應用》最新投稿經驗2024年5月

研二下第一次投稿&#xff0c;深度學習長時間序列預測方向&#xff0c;選擇了《計算機工程與應用》期刊&#xff0c;是CSCD擴展刊北大核心&#xff0c;且在24年被EI收錄等等。4.10交稿到最后5.31收到錄用通知&#xff0c;歷時不到2個月&#xff0c;總的來說編輯部效率確實高。 …

LLM背后的基礎模型 1

寫在最前面的話 任何開源技術是最有生命力的&#xff0c;也是最具分享精神的。一直覺得大模型領域需要有一個系列能夠從零開始系統性的講述領域知識&#xff0c;給與這個領域的從業人員或者對其有興趣的門外漢及時的幫助。國外承擔“布道者”的公司眾多&#xff0c;而數磚公司…