剑指offer第一个题就是二维数组的查找,天真地想用二维数组做,结果点开人家的在线编程,给的是vector。[尴尬......]
用vector实现二维数组的好处:
1、数组的越界可能会引起程序的崩溃,动态性不好,包括动态改变大小,动态申请。
2、vector提供了operator[]函数,可以像数组一样的操作,而且还有边界检查,动态改变大小。
简单说下C++构建动态的二维数组:
int **p;
p = new int*[10]; //注意,int*[10]表示一个有10个元素的指针数组
for (int i = 0; i < 10; ++i)
{
p[i] = new int[5];
}
用vector实现二维数组:
一、定义一个二维数组并初始化:
vector<vector<int> > array(m); //这个m一定不能少
//初始化一个m*n的二维数组
for(int i=0;i<m;i++)
{
array[i].resize(n);
}
二、下面的代码将实现:
产生二维数组,
给二维数组赋值,
扩大原有的二维数组,
数组下标进行访问,
迭代器进行访问。
#include<vector>
#include<iostream>
using namespace std;
int main()
{
vector<int> vc;
vc.push_back(1);
vc.push_back(2);
vc.push_back(3);
int count = 0;
二维数组
vector<vector<int>> sz(3);
for(int i=0;i<3;i++)
sz[i].resize(4);//创建了一个3*4的二维数组
//(利用下标)类似二维数组//
for(int i=0;i<3;++i)
for(int j=0;j<4;++j)
sz[i][j] = ++count;
for(int i=0;i<3;++i)
{
for(int j=0;j<4;++j)
{
cout<<sz[i][j]<<" ";
}
cout<<endl;
}
cout<<endl;
//动态扩大了二位数字的大小
这是在原有的基础上再开的并不会把之前的清空
sz.resize(5);//重新设置了大小为5
//
sz[3].resize(4);
sz[4].resize(4);//这两句相当于是初始化新开的两个空间。
这两句不写的话代码会出现内存错误,并崩溃掉
for(int i=0;i<5;++i)
{
for(int j=0;j<4;++j)
{
cout<<sz[i][j]<<" ";
}
cout<<endl;
}
//(利用迭代器)类似指针/
vector<int>::iterator it;//===========>相当于列
vector<vector<int>>::iterator iter;//=>相当于行
vector<int> vec_tmp;
cout<<"Use iterator:"<<endl;
for(iter = sz.begin();iter != sz.end();iter++)
{
vec_tmp = *iter;
for(it = vec_tmp.begin();it!=vec_tmp.end();it++)
cout<<*it<<" ";
cout<<endl;
}
}