網站首頁 編程語言 正文
前言
注意vector<vector<int> >后面的尖括號前面要加上空格,否則在有些編譯器出現問題
vector<vector<int>> A;//錯誤的定義方式
vector<vector<int> > A;//正確的定義方式
一、為什么是vector?
對于數組,大家常用索引和指針來操作數組,給程序設計帶來了很大的靈活性。但是數組的越界可能會引起程序的崩潰,而且動態性不好,包括動態改變大小,動態申請。有什么辦法可以解決這些問題嗎?
關于vector我不想多說,我假設大家都了解temlplate 和 STL比如map、list、vector等)。 學習C++的時候學到過STL(標準模板庫)知道vector提供了operator[]函數。可以像數組一樣的操作,而且還有邊界檢查,動態改變大小。vector本來就是可以用來代替一維數組的,vector提供了operator[]函數,可以像數組一樣的操作,而且還有邊界檢查,動態改變大小。這里只介紹用它來代替二維的數組,二維以上的可以依此類推。
vector<vector<int> > array2(3);
array2可以保存3個向量,向量的長度是可以改變的。array2[i]返回的是第i個向量。同理,array2[i][j]返回的是第i個向量中的第j個元素。
vector<vector<int> > array2(3);
array2[1][2]=9;
我保證你的程序會segement failed,原因就是你沒有指定向量的大小。用push_back函數可以解決問題,如下:
for(int i=0;i<3;i++)
array2[i].resize(3);//就定義了一個3X3的數組了(另一個3在 申明時定義的)。而且你可以隨時改變它的大小
二、什么是vector?
向量(Vector)是一個封裝了動態大小數組的順序容器(Sequence Container)。跟任意其它類型容器一樣,它能夠存放各種類型的對象。可以簡單的認為,向量是一個能夠存放任意類型的動態數組。
2.0 容器特性
1)順序序列
順序容器中的元素按照嚴格的線性順序排序。可以通過元素在序列中的位置訪問對應的元素。
2)動態數組
支持對序列中的任意元素進行快速直接訪問,甚至可以通過指針算述進行該操作。操供了在序列末尾相對快速地添加/刪除元素的操作。
3)能夠感知內存分配器的
容器使用一個內存分配器對象來動態地處理它的存儲需求。
2.1. 基本操作
a. 頭文件#include<vector>
b. 創建vector對象:vector dp;
c. 尾部插入數字:vec.push_back(a);
d. 使用下標訪問元素,cout<<dp[0]<<endl;記住下標是從0開始的。
使用迭代器訪問元素.
vector::iterator it;
for(it=vec.begin();it!=vec.end();it++) cout<<*it<<endl;
e. 插入元素: vec.insert(vec.begin()+i,a);在第i個元素后面插入a;
f. 刪除元素: vec.erase(vec.begin()+2);刪除第3個元素
vec.erase(vec.begin()+i,vec.end()+j);刪除區間[i,j-1];區間從0開始
h. 向量大小:vec.size();
g. 清空:vec.clear();//清空之后,vec.size()為0
2.2. 常見定義方法:
(1) vector<int> a(5); //定義了5個整型元素的向量(<>中為元素類型名,它可以是任何合法的數據類型),但沒有給出初值,其值是不確定的.
(2)vector<int> a(5,1);//定義了5個整型元素的向量,且給出每個元素的初值為1
(3)vector<int> a(b); //用b向量來創建a向量,整體復制性賦值
(4)vector<int> a(b.begin(),b.begin+3); //定義了a值為b中第0個到第2個(共3個)元素
(5)int b[7]={1,2,3,4,5,9,8}; vector<int> a(b,b+7); //從數組中獲得初值
2.3. 使用方法
2.3.1 創建一維vector:
vector<int>nums;//不指定長度
vector<int>nums(n); // 指定長度為n
添加元素
nums.push_back(1);//直接從數組末端添加
nums[i] = 1;//直接賦值給第i個位置
刪除元素
nums.resize(nums.size-i); //直接將數組長度減小,某種方式上刪掉了后面i個
nums.pop_back();//刪掉最后一個元素
數組遍歷
for(int i = 0; i < nums.size(); i++) cout<<nums[i]<<endl;
獲得長度
nums.size()
排序(O(nlogn))
sort(nums.begin(),nums.end());
翻轉
reverse(nums.begin(), nums.end());
合并兩個vector
合并nums1和nums2,并將合并后的數組賦值給nums
vector<int>nums1(m),nums2(n);
vector<int>nums;
nums.resize(m+n);
merge(nums1.begin(), nums1.end(),nums2.begin(),nums2.end(),nums);
2.3.2 定義二維vector
vector<vector<int> > v;
訪問二維vector的元素: 如果指定外層和內層向量的大小,就可用operator[]進行讀和寫;如果只指定外層向量大小,就能用push_back()函數進行寫,不能用operator[]進行讀和寫。
1). 創建m*n的二維vector:
vector<vector <int> >nums(m ,vector<int>(n)); //m*n的二維vector
定義了一個vector容器,元素類型為vector,初始化為包含m個vector對象,每個對象都是一個新創立的vector對象的拷貝,而這個新創立的vector對象被初始化為包含n個0。
vector(n)表示構造一個無名且含n個0的vector對象。
2). 動態創建m*n的二維vector
方法一:
vector<vector <int> > nums;
nums.resize(m);
for(int i=0;i<m;i++) nums[i].resize(n);
方法二:
vector<vector <int> > nums;
nums.resize(m,vector<int>(n));
3).初始化二維數組
vector<vector `<int>` > nums(m ,vector`<int>`(n,0)); //m*n的二維vector,所有元素為0
獲得二維數組的行數:nums.size();
獲得二維數組的列數:nums[0].size()
4). 數組遍歷
int m = nums.size(),n = nums[0].size();
for(int i = 0; i < m; i++){
for(int j = 0; j < n; j++){
cout<<nums[i][j]<<endl;
}
}
三、vector<int>指針形式比較
在使用STL容器(比如map、list、vector等)的時候,是用放一個對象還是放一個對象指針?
即是用vector還是vector<int*>,這里的vector可以換成其他的容器,int可以換成其他基本類型,也可以自定義的數據結構或類。
1). vector不需要動態操作內存,不用擔心內存泄露等問題;vector<int*>要注意new和delete成對使用。
2). 當int改變成其他類型或結構或類的時候,用vector<int*>這種方式比較方便,容器里放的內容占用的內存也相對要少一些,指針在用的時候,去申請空間,不用,那就是個占用4個字節的地址。
3). 當需要對變量不斷讀寫操作時,最好得用指針形式,僅僅通過傳遞指針加快了訪問速度。
vector<int>
vector<int> vecTemp;
for (int i=0; i< 10; i++)
{
vecTemp.push_back(i); //這種方式不需要動態new內存,當然也不用delete。
}
vector<int*>
vector<int*> vecTemp;
for (int i=0; i< 10; i++)
{
int* nTemp = new int;
*nTemp = i;
vecTemp.push_back(nTemp);
}
vector<int> *a;
當使用這種vector指針時,指針a代表的是:不能通過a[i]訪問值,只可能通過a->at(i)訪問值。
四.幾種常見場景
4.1 vector<int>& nums
1) int &nums:一個整型變量的引用
2) vector nums:nums是一個容器變量,容器名稱為vector,容器內存的數據為int型
3) vector &nums:nums為一個引用,引用的內容是vector這個容器內部存放的整型數據
//1) 創建一維vector
vector<int> nums; //不指定長度
vector<int> nums(n); //指定長度
//2) 添加元素
nums.push_back(1); //直接在末端添加元素1
//3) 刪除元素
nums.resize(num.size-i); //刪除后面i個元素
nums.pop_back(); //刪除最后一個元素
//4) 獲取長度
nums.size();
//5) 判空
nums.empty();
4.2 vector<int> nums
vector<int>& a;
vector<int> a;
說明: 帶&表示傳入函數的是vector的引用(即物理位置),函數內部對vector改動,vector就會改變;
不帶&表示傳入的是vector的復制品(開辟了另一塊位置),函數內部對其改動,不會影響原本的vector;
4.3 vector< vector<int> > v(m, vector<int>(n) );
定義了一個vector容器,元素類型為vector,初始化為包含m個vector對象,每個對象都是一個新創立的vector對象的拷貝,而這個新創立的vector對象被初始化為包含n個0。
從結果上看,類似于創建了一個m×n的二維數組,而且可以通過v[i][j]的方式來訪問元素(vector支持下標訪問元素)。
4.4 vector< vector <int> > dp(m, vector<int>(n) )
vector<類型>標識符(最大容量,初始所有值)
vector< vector<int> > v(m, vector<int>(n) );定義了一個vector容器,元素類型為vector,初始化為包含m個vector對象,每個對象都是一個新創立的vector對象的拷貝,而這個新創立的vector對象被初始化為包含n個0。
總結
原文鏈接:https://blog.csdn.net/Y1730008223CONG/article/details/123821901
相關推薦
- 2023-07-13 react 非授控組件和授控組件的區別
- 2023-03-28 基于Python開發云主機類型管理腳本分享_python
- 2022-01-28 Mybatis插件-責任鏈模式
- 2022-06-01 C語言?超詳細梳理總結動態內存管理_C 語言
- 2022-06-25 Android開發壁紙的驗證設置和確認功能實現demo_Android
- 2022-08-27 Oracle數據庫存儲過程的調試過程_oracle
- 2022-11-12 C語言用遞歸函數對素數進行判斷流程_C 語言
- 2022-03-10 C語言之循環語句詳細介紹_C 語言
- 最近更新
-
- 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同步修改后的遠程分支