今天在leetcode中刷题遇到了一个地方要引用数组作为参数传递(当然可以传地址,但是我不是太喜欢这种方式)。在网上查了一下找到了一个有趣的东西,vector,在很多地方它可以完美的弥补数组的缺点。
vector是C++标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库。vector之所以被认为是一个容器,是因为它能够像容器一样存放各种类型的对象,简单地说,vector是一个能够存放任意类型的动态数组,能够增加和压缩数据。也就是说它可以是变长的!!
基本操作
(1)头文件#include<vector>
.
(2)创建vector对象,一维vector<int> num
;
二维vector<vector<int> > num
要注意的是这里第1个>和第2个>之间有一个空格!!!
(3)尾部插入数字:vec.push_back(num);
(4)使用下标访问元素,cout<<num[0]<<endl;
记住下标是从0开始的。和数组很像哦 >.<
(5)除了使用下标来访问vector对象的元素外,标准库还提供了访问元素的方法:使用迭代器。迭代器是一种检查容器内元素并且遍历元素的数据类型。每种容器都定义了一队命名为begin和end的函数,用于返回迭代器。(后面再详细说迭代器)
(6)插入元素: num.insert(num.begin()+i,a);
在第i+1个元素前面插入a;
(7)删除元素: num.erase(num.begin()+2);
删除第3个元素
num.erase(num.begin()+i,num.end()+j);
删除区间[i,j-1];区间从0开始
(8)返回向量长度:num.size();
如果是二维的话:向量的行数:num.size();向量的列数:num[0].size()
(9)清空:num.clear();
以上只是一些基本操作,比较常用,这个帖子里讲的函数比较全,传送门:http://blog.sina.com.cn/s/blog_9f1c0931010180cy.html
迭代器简介
(1)迭代器
迭代器是一种检查容器内元素并且遍历元素的数据类型。容器,vector就是一个容器,它能放各种类型的数据类型。
(2)容器的iterator类型
每种容器类型都定义了自己的迭代器类型,如vector:vector<int> ::iterator iter;
变量名为iter。
(3)begin和end操作
每种容器都定义了一队命名为begin和end的函数,用于返回迭代器。如果容器中有元素的话,由begin返回的元素指向第一个元素。vector<int>::iterator iter=v.begin();
若v不为空,iter指向v[0]。由end返回的迭代器指向最后一个元素的下一个,不存在,若v为空,begin和end返回的相同。*iter=0;iter++
即将迭代器向前移动一个位置即将v[0]赋值为0,由end返回的不允许进行解操作。==和!=操作符来比较两个迭代器,若两个迭代器指向同一个元素,则它们相等,否则不想等。迭代器使用举例:for(vector<int>::iterator iter=v.begin();iter!=v.end();iter++) *iter=0;
将vector中的元素全部赋值为0;
其实我觉得迭代器有点像指针。
给一个使用的例子吧
#include<iostream>
#include<vector>
using namespace std;
void dfs(vector<vector<char> > &grid , int hight ,int width , int i , int j);
int numIslands(vector<vector<char> > &grid) {
int i=0,j=0;
int numLands=0;
int numRows=grid.size();
int numColumns=grid[0].size();
for(i=0;i<numRows;i++) {
for(j=0;j<numColumns;j++){
if(grid[i][j]=='x') continue;
if(grid[i][j]=='1'){
dfs(grid,numRows,numColumns,i, j );
numLands++;
}
else grid[i][j]='x';
}
}
return numLands;
}
void dfs(vector<vector<char> > &grid , int hight ,int width , int i , int j){
if((i<0)||(j<0)||(i>hight)||(j>width)) return;
if((grid[i][j]=='x')||(grid[i][j]=='0')) return;
grid[i][j]='x';
dfs(grid,hight,width,i,j+1);
dfs(grid,hight,width,i+1,j);
dfs(grid,hight,width,i,j-1);
dfs(grid,hight,width,i-1,j);
}
int main(){
char num[4][5]={
{'1','1','1','0','0'},
{'1','1','0','1','0'},
{'1','1','0','0','0'},
{'0','0','0','0','0'}
};
vector<vector<char> > num_vec(4,vector<char>(0));
for(int i = 0; i < 4; i++ ) {
for (int j = 0; j < 5; j++ ) {
num_vec[i].push_back(num[i][j]);
}
}
for(int i = 0; i < 4; i++ ) {
for (int j = 0; j < 5; j++ ) {
cout<<num_vec[i][j]<<" ";
}
cout<<endl;
}
cout<<"number of islands ="<<numIslands(num_vec)<<endl;
return 0;
}