網站首頁 編程語言 正文
前言
當我們使用C語言的語法來實現數組的時候,增刪查改都需要自己來定義函數,STL中給出了數組模板vector,其中包含函數可以幫助我們更便捷地處理數組。
1.vector是什么
1.vector是一個表示可變大小數組的容器。
2.vector采用連續存儲空間來進行元素的存儲。
3.vector使用動態分配數組來存儲它的元素。
2.vector創建對象
以下為vector的四種拷貝構造函數。
vector<int> v1;//創建空對象v1 vector<int> v2(10, 8);//創建有十個8的對象v2 vector<int> v3(++v2.begin(), --v2.end());//通過迭代器進行拷貝構造,迭代器可以加減操作 vector<int> v4(v3);//拷貝構造 string s("hello world"); vector<char> v5(s.begin(), s.end());
vector創建對象的過程也就是它調用其構造函數和拷貝構造的過程,我們也可以將s中字符串存入容器v5中。
注意vector<char>不能取代string,這是因為使用vector<char>需要手動打印’\0’,并且vector也不支持+=和比較大小等一系列的操作。
3.遍歷vector
為了更好地演示,我們先定義一個數組,并向其中傳入數據。
vector<int> v; v.push_back(1); v.push_back(2); v.push_back(3); v.push_back(4); v.push_back(5);
(1)下標遍歷
下標遍歷可讀可寫。
for (int i = 0; i < v.size(); i++) { v[i] += 1;//可以修改,因為返回的值是引用 cout << v[i] << endl; }
(2)迭代器遍歷
vector<int>::iterator it = v.begin();while (it != v.end()){*it -= 1;cout << *it << " " ;++it;}
(3)范圍for遍歷
for (auto& e: v) { cout << e << " "; }
原生指針就是天然的迭代器,數組支持范圍for會被替換成指針。
3.vector容量函數
表示vector容量的函數一共有三個。
cout << v2.size() << endl; cout << v2.capacity() << endl; cout << v2.max_size() << endl;
v2.size()表示的是目前元素個數。
v2.capacity()表示的是最大容量。
v2.max_xize()表示的是系統可以分配的給vector<int>的最大容量(還未分配)。
如果內存是一個圖書館的話,vector<int>表示的是一個書架,size()就表示書架上放了多少書,capacity()表示的就是書架的最大容量,max_size表示的是圖書館中最大能放一個容量為多大的書架。
4.vector的擴容函數
我們使用vector的時候通常也是在堆上開辟空間的。這就需要用到兩個函數,reseve和resize,其使用方法和string的一樣,reserve只開空間不初始化,resize開空間而且還初始化,不傳初始化內容默認為0。
vector<int> v2(10,45);//創建有十個8的對象v2 cout << v2.size() << endl; cout << v2.capacity() << endl; v2.reserve(20); cout << v2.size() << endl; cout << v2.capacity() << endl;
resize需要借助調試來觀察初始化的內容:
通過調試我們可以看到新開辟的空間里都初始化成了0。
我們還可以通過assign函數來將之前的內容進行覆蓋。
vector<int> v1;//創建空對象v1 vector<int> v2(10,45);//創建有十個8的對象v2 v2.assign(20, 5);
5.vector的插入刪除
(1)尾插與尾刪
插入刪除主要使用四個函數:
尾插:push_back
尾刪:pop_back
定點插入:insert
定點刪除:erase
刪除所有數據:clear
vector<int> v1;//創建空對象v1 v1.push_back(1); v1.push_back(2); v1.push_back(3); v1.push_back(4); for (auto& e: v1) { cout << e << " "; }
pop_back這里就不演示了,就是一個簡單的尾刪。
(2)insert與erase
insert與erase是最容易引起迭代器失效的兩個函數,關于迭代器失效的原理我會在下一節vector的模擬實現中詳細解釋。現在只需要記住string與vector迭代器失效的兩種情況即可:
1.如果空間被重新分配,則指向容器的迭代器、指針和引用都會失效。
2.如果空間沒被重新分配,指向插入位置之前的元素的迭代器、指針和引用依然有效,但指向插入位置之后元素的帶帶器、指針和引用將會失效。
注意,這里的迭代器指的是我們自己定義的迭代器。
vector<int>::iterator ret = v1.begin(); v1.insert(ret, 0);//在ret處插入0
我們可以通過insert來進行插入元素。
但當我們進行刪除的時候,如果這樣寫程序會報錯的。
vector<int>::iterator ret = v1.begin(); v1.insert(ret, 0); v1.erase(ret);
這是因為我們對v1進行了插入數據,空間被重新分配了,原有的ret失效了。如果要刪除首元素,需要使用v1.begin()來刪除。
為了保險起見,使用插入或者刪除的操作之后,一定要記得更新迭代器。
(3)clear
clear會刪除所有數據,注意一點,刪除數據不會刪除容量。
vector的特殊應用?
vector<vector <int>>
表示一個二維數組,vector本身就是一個模板類型,里面也可以存放一個vector<int>的類型。
相當于vector本身是一個數組,它的每個數據又是一個int類型的數組。
vector<string>
表示數組中每一個元素都是一個字符串。
6.總結
vector的基本函數都介紹完了,這些已經足夠我們使用了,如果知識在精不在多,如果還希望了解更過vector的成員函數的話,可以登錄cplusplus.com來進行搜索。
原文鏈接:https://blog.csdn.net/qq_51492202/article/details/123752797
相關推薦
- 2022-06-30 C語言詳細圖解浮點型數據的存儲實現_C 語言
- 2023-10-10 微信授權與拒絕授權的彈窗處理
- 2022-07-01 Go?數據結構之二叉樹詳情_Golang
- 2022-03-12 c++調用實現yolov5轉onnx介紹_C 語言
- 2023-06-03 scipy稀疏數組dok_array的具體使用_python
- 2022-05-15 C++11:lambda表達式詳細介紹
- 2022-07-29 解決Vmware虛擬機安裝centos8報錯“Section?%Packages?Does?Not?
- 2022-11-28 協程作用域概念迭代RxTask?實現自主控制_Android
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支