C++中vector<vector<int>?>的基本使用方法
前言
注意vector<vector<int> >后面的尖括號(hào)前面要加上空格,否則在有些編譯器出現(xiàn)問(wèn)題
vector<vector<int>> A;//錯(cuò)誤的定義方式 vector<vector<int> > A;//正確的定義方式
一、為什么是vector?
對(duì)于數(shù)組,大家常用索引和指針來(lái)操作數(shù)組,給程序設(shè)計(jì)帶來(lái)了很大的靈活性。但是數(shù)組的越界可能會(huì)引起程序的崩潰,而且動(dòng)態(tài)性不好,包括動(dòng)態(tài)改變大小,動(dòng)態(tài)申請(qǐng)。有什么辦法可以解決這些問(wèn)題嗎?
關(guān)于vector我不想多說(shuō),我假設(shè)大家都了解temlplate 和 STL比如map、list、vector等)。 學(xué)習(xí)C++的時(shí)候?qū)W到過(guò)STL(標(biāo)準(zhǔn)模板庫(kù))知道vector提供了operator[]函數(shù)??梢韵駭?shù)組一樣的操作,而且還有邊界檢查,動(dòng)態(tài)改變大小。vector本來(lái)就是可以用來(lái)代替一維數(shù)組的,vector提供了operator[]函數(shù),可以像數(shù)組一樣的操作,而且還有邊界檢查,動(dòng)態(tài)改變大小。這里只介紹用它來(lái)代替二維的數(shù)組,二維以上的可以依此類推。
vector<vector<int> > array2(3);
array2可以保存3個(gè)向量,向量的長(zhǎng)度是可以改變的。array2[i]返回的是第i個(gè)向量。同理,array2[i][j]返回的是第i個(gè)向量中的第j個(gè)元素。
vector<vector<int> > array2(3); array2[1][2]=9;
我保證你的程序會(huì)segement failed,原因就是你沒(méi)有指定向量的大小。用push_back函數(shù)可以解決問(wèn)題,如下:
for(int i=0;i<3;i++) array2[i].resize(3);//就定義了一個(gè)3X3的數(shù)組了(另一個(gè)3在 申明時(shí)定義的)。而且你可以隨時(shí)改變它的大小
二、什么是vector?
向量(Vector)是一個(gè)封裝了動(dòng)態(tài)大小數(shù)組的順序容器(Sequence Container)。跟任意其它類型容器一樣,它能夠存放各種類型的對(duì)象??梢院?jiǎn)單的認(rèn)為,向量是一個(gè)能夠存放任意類型的動(dòng)態(tài)數(shù)組。
2.0 容器特性
1)順序序列
順序容器中的元素按照嚴(yán)格的線性順序排序??梢酝ㄟ^(guò)元素在序列中的位置訪問(wèn)對(duì)應(yīng)的元素。
2)動(dòng)態(tài)數(shù)組
支持對(duì)序列中的任意元素進(jìn)行快速直接訪問(wèn),甚至可以通過(guò)指針?biāo)闶鲞M(jìn)行該操作。操供了在序列末尾相對(duì)快速地添加/刪除元素的操作。
3)能夠感知內(nèi)存分配器的
容器使用一個(gè)內(nèi)存分配器對(duì)象來(lái)動(dòng)態(tài)地處理它的存儲(chǔ)需求。
2.1. 基本操作
a. 頭文件#include<vector>
b. 創(chuàng)建vector對(duì)象:vector dp;
c. 尾部插入數(shù)字:vec.push_back(a);
d. 使用下標(biāo)訪問(wèn)元素,cout<<dp[0]<<endl;記住下標(biāo)是從0開(kāi)始的。
使用迭代器訪問(wèn)元素.
vector::iterator it; for(it=vec.begin();it!=vec.end();it++) cout<<*it<<endl;
e. 插入元素: vec.insert(vec.begin()+i,a);在第i個(gè)元素后面插入a;
f. 刪除元素: vec.erase(vec.begin()+2);刪除第3個(gè)元素
vec.erase(vec.begin()+i,vec.end()+j);刪除區(qū)間[i,j-1];區(qū)間從0開(kāi)始
h. 向量大小:vec.size();
g. 清空:vec.clear();//清空之后,vec.size()為0
2.2. 常見(jiàn)定義方法:
(1) vector<int> a(5); //定義了5個(gè)整型元素的向量(<>中為元素類型名,它可以是任何合法的數(shù)據(jù)類型),但沒(méi)有給出初值,其值是不確定的.
(2)vector<int> a(5,1);//定義了5個(gè)整型元素的向量,且給出每個(gè)元素的初值為1
(3)vector<int> a(b); //用b向量來(lái)創(chuàng)建a向量,整體復(fù)制性賦值
(4)vector<int> a(b.begin(),b.begin+3); //定義了a值為b中第0個(gè)到第2個(gè)(共3個(gè))元素
(5)int b[7]={1,2,3,4,5,9,8}; vector<int> a(b,b+7); //從數(shù)組中獲得初值
2.3. 使用方法
2.3.1 創(chuàng)建一維vector:
vector<int>nums;//不指定長(zhǎng)度 vector<int>nums(n); // 指定長(zhǎng)度為n
添加元素
nums.push_back(1);//直接從數(shù)組末端添加 nums[i] = 1;//直接賦值給第i個(gè)位置
刪除元素
nums.resize(nums.size-i); //直接將數(shù)組長(zhǎng)度減小,某種方式上刪掉了后面i個(gè) nums.pop_back();//刪掉最后一個(gè)元素
數(shù)組遍歷
for(int i = 0; i < nums.size(); i++) cout<<nums[i]<<endl;
獲得長(zhǎng)度
nums.size()
排序(O(nlogn))
sort(nums.begin(),nums.end());
翻轉(zhuǎn)
reverse(nums.begin(), nums.end());
合并兩個(gè)vector
合并nums1和nums2,并將合并后的數(shù)組賦值給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;
訪問(wèn)二維vector的元素: 如果指定外層和內(nèi)層向量的大小,就可用operator[]進(jìn)行讀和寫(xiě);如果只指定外層向量大小,就能用push_back()函數(shù)進(jìn)行寫(xiě),不能用operator[]進(jìn)行讀和寫(xiě)。
1). 創(chuàng)建m*n的二維vector:
vector<vector <int> >nums(m ,vector<int>(n)); //m*n的二維vector
定義了一個(gè)vector容器,元素類型為vector,初始化為包含m個(gè)vector對(duì)象,每個(gè)對(duì)象都是一個(gè)新創(chuàng)立的vector對(duì)象的拷貝,而這個(gè)新創(chuàng)立的vector對(duì)象被初始化為包含n個(gè)0。
vector(n)表示構(gòu)造一個(gè)無(wú)名且含n個(gè)0的vector對(duì)象。
2). 動(dòng)態(tài)創(chuàng)建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).初始化二維數(shù)組
vector<vector `<int>` > nums(m ,vector`<int>`(n,0)); //m*n的二維vector,所有元素為0
獲得二維數(shù)組的行數(shù):nums.size();
獲得二維數(shù)組的列數(shù):nums[0].size()
4). 數(shù)組遍歷
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等)的時(shí)候,是用放一個(gè)對(duì)象還是放一個(gè)對(duì)象指針?
即是用vector還是vector<int*>,這里的vector可以換成其他的容器,int可以換成其他基本類型,也可以自定義的數(shù)據(jù)結(jié)構(gòu)或類。
1). vector不需要?jiǎng)討B(tài)操作內(nèi)存,不用擔(dān)心內(nèi)存泄露等問(wèn)題;vector<int*>要注意new和delete成對(duì)使用。
2). 當(dāng)int改變成其他類型或結(jié)構(gòu)或類的時(shí)候,用vector<int*>這種方式比較方便,容器里放的內(nèi)容占用的內(nèi)存也相對(duì)要少一些,指針在用的時(shí)候,去申請(qǐng)空間,不用,那就是個(gè)占用4個(gè)字節(jié)的地址。
3). 當(dāng)需要對(duì)變量不斷讀寫(xiě)操作時(shí),最好得用指針形式,僅僅通過(guò)傳遞指針加快了訪問(wèn)速度。
vector<int> vector<int> vecTemp; for (int i=0; i< 10; i++) { vecTemp.push_back(i); //這種方式不需要?jiǎng)討B(tài)new內(nèi)存,當(dāng)然也不用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;
當(dāng)使用這種vector指針時(shí),指針a代表的是:不能通過(guò)a[i]訪問(wèn)值,只可能通過(guò)a->at(i)訪問(wèn)值。
四.幾種常見(jiàn)場(chǎng)景
4.1 vector<int>& nums
1) int &nums:一個(gè)整型變量的引用
2) vector nums:nums是一個(gè)容器變量,容器名稱為vector,容器內(nèi)存的數(shù)據(jù)為int型
3) vector &nums:nums為一個(gè)引用,引用的內(nèi)容是vector這個(gè)容器內(nèi)部存放的整型數(shù)據(jù)
//1) 創(chuàng)建一維vector vector<int> nums; //不指定長(zhǎng)度 vector<int> nums(n); //指定長(zhǎng)度 //2) 添加元素 nums.push_back(1); //直接在末端添加元素1 //3) 刪除元素 nums.resize(num.size-i); //刪除后面i個(gè)元素 nums.pop_back(); //刪除最后一個(gè)元素 //4) 獲取長(zhǎng)度 nums.size(); //5) 判空 nums.empty();
4.2 vector<int> nums
vector<int>& a; vector<int> a;
說(shuō)明: 帶&表示傳入函數(shù)的是vector的引用(即物理位置),函數(shù)內(nèi)部對(duì)vector改動(dòng),vector就會(huì)改變;
不帶&表示傳入的是vector的復(fù)制品(開(kāi)辟了另一塊位置),函數(shù)內(nèi)部對(duì)其改動(dòng),不會(huì)影響原本的vector;
4.3 vector< vector<int> > v(m, vector<int>(n) );
定義了一個(gè)vector容器,元素類型為vector,初始化為包含m個(gè)vector對(duì)象,每個(gè)對(duì)象都是一個(gè)新創(chuàng)立的vector對(duì)象的拷貝,而這個(gè)新創(chuàng)立的vector對(duì)象被初始化為包含n個(gè)0。
從結(jié)果上看,類似于創(chuàng)建了一個(gè)m×n的二維數(shù)組,而且可以通過(guò)v[i][j]的方式來(lái)訪問(wèn)元素(vector支持下標(biāo)訪問(wèn)元素)。
4.4 vector< vector <int> > dp(m, vector<int>(n) )
vector<類型>標(biāo)識(shí)符(最大容量,初始所有值)
vector< vector<int> > v(m, vector<int>(n) );定義了一個(gè)vector容器,元素類型為vector,初始化為包含m個(gè)vector對(duì)象,每個(gè)對(duì)象都是一個(gè)新創(chuàng)立的vector對(duì)象的拷貝,而這個(gè)新創(chuàng)立的vector對(duì)象被初始化為包含n個(gè)0。
總結(jié)
到此這篇關(guān)于C++中vector<vector<int> >基本使用的文章就介紹到這了,更多相關(guān)C++ vector<vector<int> >用法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++實(shí)現(xiàn)和電腦對(duì)戰(zhàn)三子棋實(shí)例
大家好,本篇文章主要講的是C++實(shí)現(xiàn)和電腦對(duì)戰(zhàn)三子棋實(shí)例,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下2022-01-01C語(yǔ)言庫(kù)函數(shù)qsort及bsearch快速排序算法使用解析
這篇文章主要為大家介紹了C語(yǔ)言庫(kù)函數(shù)qsort及bsearch快速排序算法的使用示例解析2022-02-02C++中結(jié)構(gòu)體的類型定義和初始化以及變量引用
這篇文章主要介紹了C++中結(jié)構(gòu)體的類型定義和初始化以及變量引用,是C++入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-09-09C++函數(shù)指針和回調(diào)函數(shù)使用解析
這篇文章主要為大家詳細(xì)介紹了C++函數(shù)指針和回調(diào)函數(shù)的使用,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-10-10