C++动态数组vector实现

最近在做将MATLAB代码转化为C/C++的工作,在实际应用时,发现动态数组非常重要,我在学习的时候也踩了许多坑,这篇就当做一篇踩坑笔记,希望读者能够绕开我踩过的坑,顺利应用动态数组。

1.静态数组、动态数组

其实在C语言中,都是静态数组,即需要在定义的时候就定下该数组的长度,然而这在实际的应用中,很大的一部分情况是我们并不知道数组的长度,因此没有办法声明长度。此时我们就需要应用可以自动扩容的动态数组啦!
动态数组,它与静态数组的最大区别是在定义的时候你可以不需要知道此时你定义的这个数组的具体长度,在你为该数组赋值时,如果存储空间不够,它会自动扩容,也就是不需要担心长度不够,数组溢出啦。

2.vector定义一维动态数组

一开始,我选用过用new来定义一个动态数组,但是这种定义方式不是很方便,赋值很繁琐,并且在使用过后你需要自己手动的去释放内存,这对于懒懒的并且记性不好的我非常不友好。在我广泛查阅资料后,我知道了vector这种方法,该方法简单易上手,主要是不用手动释放内存,就是效率有些低,但是总体来说用vector定义动态数组还是非常值得一试的!

(1)声明
在你要使用vector这个容器时,你需要在代码开头的部分进行声明,代码如下:

#include<vector>
using namespace std;

(2)用vector定义一个一维数组
请看下面语句:

vector <int> n;

在这句代码中,我利用vector定义了一个动态数组,名称是 n ,这个数组中存储的数据类型是int型。并不需要在此处指定数组的大小。
vector定义数组非常灵活,这里的数据类型不仅仅局限于int,double这种基本的数据类型,这里甚至可以使结构。

(3)vector一维数组的赋值
一般情况vector动态数组都是利用for循环进行复制的。
例子:

vector <int> n;
int i;
for (i = 0; i<ALL_Length; i++) //其中ALL_Length可以是一个常数,也可以是变量,例如其他已经有值的动态数组长度
 {
  n.push_back(0);
 }

注意(新手常见错误):
① 使用 push_back 对动态数组进行初次赋值!
很多人在一开始的时候可能会这样赋值 n[i] = x[j],这里 n 和 x 都是一个一维数组,是想将 x 数组中的第 j 个值赋给 n 数组的第 i 个值。这个操作看似没什么问题,但是在debug的时候回出错。错误的原因是在用vector定义了一个移位数组时,这个数组是空的,因此就没有下标,所以不能直接对下标进行操作,要使用 push_back ,将要输入的值一个一个按照次序输入进去,就可以将代码改写为n.push_back(x[j]);

② 创建的动态数组的长度问题
请看下面一段代码:

//此段代码存在问题,是典型的反例
vector <int> n;
int len_n = n.size();
int i;
for (i = 0; i<len_n; i++) //其中ALL_Length可以是一个常数,也可以是变量,例如其他已经有值的动态数组长度
 {
  n.push_back(0);
 }

此段代码与上面赋值的代码大致相同,只是该段代码在用vector定义了一个动态数组 n 后,int len_n = n.size(); ,这行代码本身是没有任何语法错误的,但是它出现的位置缺不对。
在你用vector定义了一个动态数组后,紧接着就来了一句取数组长度的语句,请注意!此时你是定义了一个数组,但是你还没有给它传值,因此,此时你取到的数组长度是 0 !所以后续你想要用这个长度作为范围来进行数组赋值就会出错,因为范围是0,所以根本这个循环就没有进去,所以到时赋值失败!

3.vector定义二维数组

具体定义形式如下:

 vector <vector <double> > m(8);

此时我定义了一个8行未知列数的矩阵,该矩阵的赋值与一维的情形类似,只是用了两层for循环。

4.vector动态数组的一些操作

(1) n[i] //返回n的第i个值
(2) n.size(); //取数组长度
(3) n.push_back(); //存数据
(4) n.pop_back(); //删除最后一个数据
(5) n.assign(x.begin(),x.end()); //将数组x的值赋给n,x.begin()是去x的首地址,x.end()是去x 的尾地址。

原创文章 8 获赞 22 访问量 1822

猜你喜欢

转载自blog.csdn.net/yangbupang/article/details/100194202