vector<vector<int>>
2016-09-21 21:53
169 查看
用vector取代C-style的数组
提起数组,大家想必都很熟悉,你可以用索引和指针来操作数组,给程序设计带来了很大的灵活性。但是你知道它有许多天生的缺陷吗?
首先,数组的越界可能会引起程序的崩溃(如果崩溃了,还算你走运^_^)。其次是动态性不好,包括动态改变大小,动态申请。诸如此类的事,一定会让你伤透脑筋。有什么办法可以解决这些问题吗?
你不用担心,下面我来给大家介绍一种方法:用vector取代C-style的数组。
关于vector我不想多说,我假设大家都了解temlplate 和 STL。各位在任何一本C++的书上都可以找的到这些内容的(如果没有,那赶快把它扔掉)。那为什么是vector呢?我们知道vector提供了operator[]函数,可以像数组一样的操作,而且还有边界检查,动态改变大小。(从这点上deque也是可以的)。vector本来就是可以用来代替一维数组的,这里只介绍用它来代替二维的数组。二维以上的可以依此类推。
我们知道,C++的template参数是可以嵌套定义的,你可以这样定义一个模板的Instance
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函数可以解决问题:array2[1].push_back(9);但是好象不太爽。就不能用operator[]吗?答案是肯定的。不过要多加几个步骤,如下:
for(int i=0;i<3;i++)
array2[i].resize(3);
这样,你就定义了一个3X3的数组了(另一个3在 申明时定义的)。而且你可以随时改变它的大小。
其他的,你还可以用C++的异常机制来捕获如下标越界等非法行为。进行必要的处理。使你的程序更加的健壮。具体的方法我就不深入介绍了。留给各位自己钻研。下面提供一个范例,供参考。
信息来源:http://blog.csdn.net/wangyin159/article/details/46878091
下面是我自己照葫芦画瓢写出来的一段代码:
<span style="font-size:18px;"> //编写一个容器,进行数据的存储,分别对应正确的标签,检测正确的个数,实际需要检测的数量
vector<vector<int>> mmm6(6);//mmm6[i]返回的是第i个向量。同理,mmm6[i][j]返回的是第i个向量中第j个元素
for (int i = 0; i < 6; i++)
{
mmm6[i].resize(2);
}//指定向量大小,定义了一个6*2的数组
for (int i = 0; i < 6; i++)
{
mmm6[i][0]=0;
mmm6[i][1]=0;
}//全部初始化为0</span>
提起数组,大家想必都很熟悉,你可以用索引和指针来操作数组,给程序设计带来了很大的灵活性。但是你知道它有许多天生的缺陷吗?
首先,数组的越界可能会引起程序的崩溃(如果崩溃了,还算你走运^_^)。其次是动态性不好,包括动态改变大小,动态申请。诸如此类的事,一定会让你伤透脑筋。有什么办法可以解决这些问题吗?
你不用担心,下面我来给大家介绍一种方法:用vector取代C-style的数组。
关于vector我不想多说,我假设大家都了解temlplate 和 STL。各位在任何一本C++的书上都可以找的到这些内容的(如果没有,那赶快把它扔掉)。那为什么是vector呢?我们知道vector提供了operator[]函数,可以像数组一样的操作,而且还有边界检查,动态改变大小。(从这点上deque也是可以的)。vector本来就是可以用来代替一维数组的,这里只介绍用它来代替二维的数组。二维以上的可以依此类推。
我们知道,C++的template参数是可以嵌套定义的,你可以这样定义一个模板的Instance
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函数可以解决问题:array2[1].push_back(9);但是好象不太爽。就不能用operator[]吗?答案是肯定的。不过要多加几个步骤,如下:
for(int i=0;i<3;i++)
array2[i].resize(3);
这样,你就定义了一个3X3的数组了(另一个3在 申明时定义的)。而且你可以随时改变它的大小。
其他的,你还可以用C++的异常机制来捕获如下标越界等非法行为。进行必要的处理。使你的程序更加的健壮。具体的方法我就不深入介绍了。留给各位自己钻研。下面提供一个范例,供参考。
<span style="font-size:18px;"><span style="font-size:18px;"> //用vector来代替数组 // 潘李亮2002-1-13 //在GNU c++ Mandrake Linux7.0下通过, //在VC下会有变量定义问题,大家自己解决 #include <iostream> #include <vector> using namespace std; void main() { vector< vector<int> > array(3); for(int i=0;i<3;i++) array[i].resize(3);//设置数组的大小3X3 //现在你可以和使用数组一样使用这个vector for(int i=0;i<3;i++) for(int j=0;j<3;j++) array[i][j]=(i*j); //输出 for(int i=0;i<3;i++) { for(int j=0;j<3;j++) cout<<array[i][j]<<" "; cout<<endl; } array.resize(5); arry[3].resize(3); arry[4].resize(3); //现在是5X3的数组了 for(int i=0;i<5;i++) for(int j=0;j<3;j++) array[i][j]=(i*j); for(int i=0;i<5;i++) { for(int j=0;j<3;j++) cout<<array[i][j]<<" "; cout<<endl; } }</span></span>
信息来源:http://blog.csdn.net/wangyin159/article/details/46878091
下面是我自己照葫芦画瓢写出来的一段代码:
<span style="font-size:18px;"> //编写一个容器,进行数据的存储,分别对应正确的标签,检测正确的个数,实际需要检测的数量
vector<vector<int>> mmm6(6);//mmm6[i]返回的是第i个向量。同理,mmm6[i][j]返回的是第i个向量中第j个元素
for (int i = 0; i < 6; i++)
{
mmm6[i].resize(2);
}//指定向量大小,定义了一个6*2的数组
for (int i = 0; i < 6; i++)
{
mmm6[i][0]=0;
mmm6[i][1]=0;
}//全部初始化为0</span>
相关文章推荐
- 第一次做树的题,并且用到了vector<pair<int,int> >,收获很大
- vector<pair<int,int> >的插入排序,字符串中子字符串个数查找
- vector<vector<int>作为二维数组
- vector<vector<int>> res=A的可行性有待商榷。
- vector<vector<int> >二维容器编程
- C++中 vector<vector<int>>
- C++中vector<int>和vector<int*>的区别
- const vector<int>::iterator和vector<int>::const_iterator的区别
- 二维数组vector<vector<int> >的建立
- queue vector less <int> 从大到小排列
- priority_queue<int,vector<int>,greater<int>>优先队列 按照由小到大顺序
- c++ std::sort用法详细(对std::vector<int>, 对std::vector<std::string>, std::vector<char>等等)
- 清除行列 请编写一个算法,若N阶方阵中某个元素为0,则将其所在的行与列清零。 给定一个N阶方阵int[][](C++中为vector<vector><int>>)mat和矩阵的阶数n,请返回完成操
- 关于vector的vector<vector<int>>的使用问题
- priority_queue<int,vector<int>,greater<int>>优先队列 按照由小到大顺序
- queue vector <int>自定义类型
- vector<vector<int> >的输入输出
- 2016.07.13-vector<vector<int>>应用2——Two Sum扩展
- C++中map<int,vector<int>>的初始化和访问方法
- 判定一个list<int>中的元素和一个vector<int>中的元素是否相等