C++中一种十分有用的容器vector

今天在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;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值