<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
注意vector<vector<int> >後面的尖括號前面要加上空格,否則在有些編譯器出現問題
vector<vector<int>> A;//錯誤的定義方式 vector<vector<int> > A;//正確的定義方式
對於陣列,大家常用索引和指標來運算元組,給程式設計帶來了很大的靈活性。但是陣列的越界可能會引起程式的崩潰,而且動態性不好,包括動態改變大小,動態申請。有什麼辦法可以解決這些問題嗎?
關於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)是一個封裝了動態大小陣列的順序容器(Sequence Container)。跟任意其它型別容器一樣,它能夠存放各種型別的物件。可以簡單的認為,向量是一個能夠存放任意型別的動態陣列。
1)順序序列
順序容器中的元素按照嚴格的線性順序排序。可以通過元素在序列中的位置存取對應的元素。
2)動態陣列
支援對序列中的任意元素進行快速直接存取,甚至可以通過指標算述進行該操作。操供了在序列末尾相對快速地新增/刪除元素的操作。
3)能夠感知記憶體分配器的
容器使用一個記憶體分配器物件來動態地處理它的儲存需求。
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
(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); //從陣列中獲得初值
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);
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; } }
在使用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)存取值。
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();
vector<int>& a; vector<int> a;
說明: 帶&表示傳入函數的是vector的參照(即物理位置),函數內部對vector改動,vector就會改變;
不帶&表示傳入的是vector的複製品(開闢了另一塊位置),函數內部對其改動,不會影響原本的vector;
定義了一個vector容器,元素型別為vector,初始化為包含m個vector物件,每個物件都是一個新創立的vector物件的拷貝,而這個新創立的vector物件被初始化為包含n個0。
從結果上看,類似於建立了一個m×n的二維陣列,而且可以通過v[i][j]的方式來存取元素(vector支援下標存取元素)。
vector<型別>識別符號(最大容量,初始所有值)
vector< vector<int> > v(m, vector<int>(n) );定義了一個vector容器,元素型別為vector,初始化為包含m個vector物件,每個物件都是一個新創立的vector物件的拷貝,而這個新創立的vector物件被初始化為包含n個0。
到此這篇關於C++中vector<vector<int> >基本使用的文章就介紹到這了,更多相關C++ vector<vector<int> >用法內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45