C++ STL 之容器 vector 常見用法

一. 什么是vector

vector為“變長數組”,即長度根據需要而自動改變的數組。
頭文件:

	#include <vector>using namespace std;

單獨定義一個vector:vector<typename> name,相當于一維數組 name[SIZE] ,其長度可以根據需要變化,比較節省空間。
和一維數組一樣,這里的 typename 可以是任何基本類型,如 int, double, char, 結構體等,也可以是STL標準容器,如vector, set, queue等。
在C++11之前,如果 typename 是一個STL容器,定義時需要在 >> 符號之間加空格,否則編譯器會將它視為移位操作,導致編譯錯誤。
例子:

	vector<int> name;vector<char> name;vector<node> name;  		//node為結構體類型vector<vector<int>> name;	//二維數組,兩個維都可以變長//二維數組,一維長度固定為100,另一維變長,name[0]~name[99]每一個都是一個vector容器vector<int> name[100];

二. vector的初始化

  1. 不帶參數的構造函數初始化
	//初始化一個size為0的空vectorvector<int> abc;
  1. 帶參數的構造函數初始化
	//初始化size,但每個元素值為默認值vector<int> abc(10);		//初始化了10個默認值為0的元素//初始化size,并且設置初始值vector<int> cde(101);		//初始化了10個值為1的元素
  1. 通過復制同類型的vector初始化
	vector<int> a(5,1);//通過復制a初始化vector<int> b(a);
  1. 通過復制 [begin,end) 區間內另一個數組的元素到vector中來進行初始化
	int a[5] = {1,2,3,4,5};//通過數組a的地址初始化,注意地址是 [0, 5)vector<int> b(a, a+5);

三. vector容器內元素的訪問

  1. 通過下標訪問
    和訪問普通數組一樣,對一個定義為vector<typename> name的vector容器來說,直接訪問 name[index] 即可(如name[0], name[1])。這里的下標是從0到name.size() - 1,訪問這個范圍外的元素可能會運行出錯。

  2. 通過迭代器訪問
    迭代器(iterator)可以理解為一種類似指針的東西,其定義為: vector<typename>::iterator it;這里 it 就是一個vector<typename>::iterator型的變量,可以通過 *it來訪問vector中的元素。
    在常用STL容器中,只有在vector和string中,才允許使用 name.begin() + 3 這種迭代器加上整數的寫法。

	//name.begin()為取name的首元素地址,it指向這個地址vector<int>::iterator it = name.begin();for(int i = 0; i < name.size(); i++){printf("%d ", *(it + i));	//輸出name[i]}//循環條件使用it != name.end(),不支持it < name.end()寫法for(vector<int>::iterator it = name.begin(); it != name.end(); it++){printf("%d ", *it);}

四. vector常用函數

1. 添加

  • void push_back(const T& x):在vector尾部添加一個元素x
  • iterator insert(iterator it, const T& x):向vector中迭代器 it 處的前方插入一個元素x
  • iterator insert(iterator it, int n, const T& x):向vector中迭代器 it 處的前方插入 n 個相同的元素x
  • iterator insert(iterator it, const_iterator first, const_iterator last):向vector中迭代器 it 處插入另一個相同類型vector的 [first,last) 間的數據
	vector<int> name;name.push_back(1);		//1vector<int>::iterator it = name.begin();name.insert(it, 2);		//2 1name.insert(it, 2, 3);	//3 3 2 1vector<int> a(2, 0);name.insert(it, a.begin(), a.begin() + 1);  //0 0 3 3 2 1

2. 刪除

  • void pop_back():刪除vector中最后一個元素
  • void clear():清空vector中所有元素
  • iterator erase(iterator it):刪除vector中迭代器 it 指向的元素
  • iterator erase(iterator first, iterator last):刪除vector中 [first,last) 范圍內的元素
	//0 0 3 3 2 1name.pop_back();	//0 0 3 3 2vector<int>::iterator it = name.begin();name.erase(it);		//0 3 3 2name.erase(it, it + 1); //3 2name.clear();

3. 遍歷

  • iterator begin():返回向量頭指針,指向第一個元素
  • iterator end():返回向量尾指針,指向向量最后一個元素的下一個位置
  • reference at(int pos):返回 pos 位置元素的引用
  • reference front():返回首元素的引用
  • reference back():返回尾元素的引用
  • reverse_iterator rbegin():反向迭代器,指向最后一個元素,即將vector反轉后,返回第一個元素
  • reverse_iterator rend():反向迭代器,指向第一個元素之前的位置,即將vector反轉后,返回最后一個元素

4. 判斷

  • bool empty() const:判斷向量是否為空,若為空,則向量中無元素
	if(name.empty()) return false;

5. 大小

  • int size() const:返回向量中元素的個數
	int len = name.size();

6. 通過copy函數賦值

	vector<int> a(5,1);int a1[5] = {2,2,2,2,2};vector<int> b(10);//將a中元素全部拷貝到b開始的位置中,注意拷貝的區間為a.begin() ~ a.end()的左閉右開的區間copy(a.begin(), a.end(), b.begin());//拷貝區間也可以是數組地址構成的區間copy(a1, a1+5, b.begin() + 5);

五. vector排序

1. 從小到大(升序)

sort排序默認升序,頭文件:#include <algorithm>

	int a[] = {8,6,2,9,3,5,4,1,7,10};vector<int> arr(a, a+5);sort(arr.begin(),arr.end());	//升序

2. 從大到小(降序)

  • (1)greater<int>()
    sort默認排序從小到大,使用greater<int>()
	int a[] = {8,6,2,9,3,5,4,1,7,10};vector<int> arr(a, a+5);sort(arr.begin(),arr.end(),greater<int>());	//降序
  • (2)自定義函數 bool cmp(int x, int y);
bool cmp_max(int x,int y){return x > y;
}int main() {int a[] = {8,6,2,9,3,5,4,1,7,10};vector<int> arr(a, a+5);sort(arr.begin(), arr.end(), cmp_max); for(int i = 0; i < arr.size(); i++){printf("%d ", arr[i]);}		 return 0 ;}
  • (3)使用sort排序后,再使用reverse() ,reverse()將元素倒置
 	sort(arr.begin(),arr.end());		//升序排列reverse(arr.begin(),arr.end());		//將數組倒置
  • (4)使用反向迭代器 rbegin() 和 rend()
      // sorts arr in "normal" ordersort(arr.begin(), arr.end());// sorts in reverse: puts smallest element at the end of arrsort(arr.rbegin(), arr.rend());

關于反向迭代器,詳見這篇博客:c++ vector begin(),end(),rbegin(),rend()問題 (C++ primer (中文版第四版) 第273頁)

3. 對結構體vector使用sort排序

當vector中的數據類型為自定義結構體類型時(元素大于等于2),想以其中某一個元素進行正序或逆序排序,則不能直接使用sort函數,通過自定義比較函數 cmp 實現排序。

#include <bits/stdc++.h>
using namespace std;struct Point2{int x;int y;
};
bool GreaterSort (Point2 a,Point2 b) { return (a.x > b.x); }
bool LessSort (Point2 a,Point2 b) { return (a.x < b.x); }
int main(){vector<Point2> aaa;Point2 temp;temp.x=1;temp.y=1;aaa.push_back(temp);temp.x=2;temp.y=2;aaa.push_back(temp);	temp.x=3;temp.y=3;aaa.push_back(temp);//降序排列sort(aaa.begin(),aaa.end(), GreaterSort);cout<<"Greater Sort:"<<endl;for (int i =0;i<aaa.size();i++){cout<<aaa[i].x<<"	"<<aaa[i].y<<endl;}//升序排列sort(aaa.begin(),aaa.end(),LessSort);cout<<"Less Sort:"<<endl;for (int i =0;i<aaa.size();i++){cout<<aaa[i].x<<"	"<<aaa[i].y<<endl;}return 0;
}

運行結果:

Greater Sort:
3       3
2       2
1       1
Less Sort:
1       1
2       2
3       3

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

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

相關文章

mac-docker-php容器連接mac中的pgsql數據庫失敗以及出現table_msg存錯誤時的解決方法

以php中的thinkphp 5.1為例&#xff0c;php容器連接mac中的pgsql數據庫失敗時&#xff0c;出現如下錯誤 [7] PDOException in Connection.php line 528 SQLSTATE[08006] [7] could not connect to server: Connection refused Is the server running on host "localhost&…

Git 配置處理客戶端無法正常訪問到 github 原網站時,npm 下載依賴包失敗的問題

Git 配置處理客戶端無法正常訪問到 github 原網站時&#xff0c;npm 下載依賴包失敗的問題 使用 github 的鏡像網站地址或類似的替代產品地址&#xff0c;代替到 npm 拉取依賴包的 git 地址本地Git配置 例如&#xff1a;執行一下命令&#xff0c;則是以https://kgithub.com 替…

requests庫/urllib3庫返回WEB響應內容的處理差異

requests庫是一個廣泛使用的HTTP庫&#xff0c;用于發送HTTP請求和處理響應。 以下是requests庫中一些主要類和方法的詳細介紹&#xff1a;requests庫主要類和方法 類:requests.models.Response: status_code: 響應狀態碼。text: 以Unicode形式返回響應內容。content: 以字節形…

MySQL的主從同步原理

MySQL的主從同步&#xff08;也稱為復制&#xff09;是一種數據同步技術&#xff0c;用于將一個MySQL服務器&#xff08;主服務器&#xff09;上的數據和變更實時復制到另一個或多個MySQL服務器&#xff08;從服務器&#xff09;。這項技術支持數據備份、讀寫分離、故障恢復等多…

帝國cms7.5仿非小號區塊鏈門戶資訊網站源碼 帶手機版

帝國cms7.5仿非小號區塊鏈門戶資訊網站源碼 帶手機版 帶自動采集 開發環境&#xff1a;帝國cms 7.5 安裝環境&#xff1a;phpmysql 包含火車頭采集規則和模塊&#xff0c;采集目標站非小號官網。 專業的數字貨幣大數據平臺模板&#xff0c;采用帝國cms7.5內核仿制&#xff0…

LeetCode_22_中等_括號生成

文章目錄 1. 題目2. 思路及代碼實現&#xff08;Python&#xff09;2.1 暴力法2.2 回溯法 1. 題目 數字 n n n 代表生成括號的對數&#xff0c;請你設計一個函數&#xff0c;用于能夠生成所有可能的并且 有效的 括號組合。 示例 1&#xff1a; 輸入&#xff1a; n 3 n 3 …

Ai-WB2-32S在window下使用vs 和 msys2編譯以及燒錄

文章目錄 前言一、使用前準備第一步 安裝vscode第二步 安裝msys2 二、使用步驟1.打開MSYS2 MINGW64&#xff08;1&#xff09;在開始欄中找到MSYS2 MINGW64并打開&#xff08;2&#xff09;安裝git&#xff08;3&#xff09;安裝make&#xff08;4&#xff09;安裝好之后的文件…

前端面試練習24.3.1

一.進程和線程的區別 進程&#xff1a;是程序的一次執行過程,擁有獨立的內存空間 線程&#xff1a;是進程中的一個執行單元,共享所屬進程的內存空間和系統資源 進程&#xff08;Process&#xff09;和線程&#xff08;Thread&#xff09;是操作系統中的重要概念&#xff0c;它…

Redis 之五:Redis 的主從復制

概念 主從復制&#xff0c;是指將一臺 Redis 服務器的數據&#xff0c;復制到其他的Redis服務器。前者稱為主節點(master)&#xff0c;后者稱為從節點(slave)&#xff1b;數據的復制是單向的&#xff0c;只能由主節點到從節點。 默認情況下&#xff0c;每臺Redis服務器都是主節…

【0272】postgres內核分配 MyBackendId 實現原理(MyBackendId、MyProc、shmInvalBuffer)(三)

相關文章: 【0255】揭曉pg內核中MyBackendId的分配機制(后端進程Id,BackendId)(一) 【0256】揭曉pg內核中MyBackendId的分配機制(后端進程Id,BackendId)(二) 第一個backend process前,shmInvalBuffer的值情況 (gdb) p *shmInvalBuffer $153 = {minMsgNum =

webpack-cli

webpack-cli做了什么 webpack-cli 是 Webpack 提供的命令行工具&#xff0c;用于在命令行中執行 Webpack 相關的操作。webpack-cli 主要完成以下幾項工作&#xff1a; 解析和處理命令行參數&#xff1a;webpack-cli 負責解析用戶在命令行中輸入的參數&#xff0c;包括配置文件…

云天勵飛戰略投資神州云海,布局機器人市場

日前,AI上市企業云天勵飛(688343.SH)完成了對深圳市神州云海智能科技有限公司(以下簡稱“神州云海”)的B輪戰略投資。 公開資料顯示,自2015年于深圳創立以來,神州云海始終聚焦人工智能與服務機器人廣闊的應用市場,依托自主的核心算法能力,深耕機器人硬件本體研發,整合上下游產…

Java學習筆記001——入門基礎知識

Java語言是一種高級編程語言&#xff0c;它采用了面向對象編程的思想&#xff0c;具有跨平臺性和安全性等優點。現如今&#xff0c;Java語言成為了世界上最流行的編程語言之一。 前一段學習Python語言&#xff0c;本文是學習java的第一篇筆記。 1. java運行環境搭建&#xff…

RabbitMQ-TTL/死信隊列/延遲隊列高級特性

文章目錄 TTL死信隊列消息成為死信的三種情況隊列如何綁定死信交換機 延遲隊列RabbitMQ如何實現延遲隊列 總結來源B站黑馬程序員 TTL TTLTTL(Time To Live):存活時間/過期時間當信息到達存活時間后&#xff0c;還沒有被消費&#xff0c;會被自動清除。RabbitMQ可以對消息設置過…

Win10系統如何重置系統

Win10系統如何重置 大家可以使用Win10內建的重設電腦設定&#xff0c;如以下操作&#xff1a; 首先&#xff0c;可以先到桌面左下角的【開始】 選擇【設定】 在【設定】裡找到【更新與安全性】 在左側欄有一項【復原】 在復原的標題下&#xff0c;副標題有一項【重設此電腦】…

【algorithm】算法基礎課---排序算法(附筆記 | 建議收藏)

&#x1f680;write in front&#x1f680; &#x1f4dd;個人主頁&#xff1a;認真寫博客的夏目淺石. &#x1f381;歡迎各位→點贊&#x1f44d; 收藏?? 留言&#x1f4dd; &#x1f4e3;系列專欄&#xff1a;AcWing算法學習筆記 &#x1f4ac;總結&#xff1a;希望你看完…

tvm交叉編譯參考資料整理

環境 ubuntu20.04&#xff0c;ndk交叉編譯部署到adnroid手機 參考&#xff1a; TVM部署神經網絡模型到android端_tvm android-CSDN博客 使用TVM在android中進行Mobilenet SSD部署 - 知乎

深度探析低代碼:助力“數智轉型”賦能中國制造

隨著數字化和智能化技術的飛速發展&#xff0c;我國制造業正面臨著從傳統制造向智能制造的轉型升級。在這個過程中&#xff0c;低代碼技術作為一種創新性的軟件開發模式&#xff0c;逐漸成為助力我國制造業數智轉型的關鍵驅動力。本文將從低代碼技術的原理、應用場景以及在我國…

?The Sandbox的南極之旅|鏈接世界:從南極洲到元宇宙

真正的發現之旅不在于尋找新的景觀&#xff0c;而在于擁有新的眼光。 - 馬塞爾-普魯斯特 在這個數字世界和物理世界日益交織的時代&#xff0c;The Sandbox 的聯合創始人 Arthur Madrid 和 Sebastien Borget 踏上了遠離數字空間的旅程&#xff0c;前往地球上未被開發的寶藏地點…

無用工作、UBI與AI

有些隱晦和黑暗的事實無法陳述&#xff0c;因為任何的系統中“無用”的結局都是被無情的拋棄和淘汰&#xff0c;AI監督下的人類結局更是如此。 什么是無用工作&#xff1f; 無用無效工作通常指的是那些看似忙碌但實際上對社會或個人沒有實質性貢獻的工作。這類工作可能包括以下…