在上一期视频中我们学习了使用切片,使用了一个数组做为箱子存放小胖的裤子。小胖想把其他的裤子也放在这个箱子里。我们使用代码实现下。
首先我们定义另一条裤子。然后使用push方法把裤子放入箱子。在这里输出下箱子里的裤子条数,如果这条裤子放进去了加上原来的5条裤子,箱子里应该有6条裤子了吧?我们运行看下是不是有6条裤子。
控制台输出了个错误,错误信息提示我们数组没有push方法。
那是不是方法名叫add呢?我们要不要试试用add方法?!我们这里就不试了,因为我们前面提到数组的容量是在创建的时候已经确定了的。就相当于我们使用数组做的箱子体积是不能变的。所以当箱子满了的时候,我们就不能再往里放东西了。也就没有在往里放东西的方法了。所以我们需要换个能变大的箱子,我们可以使用Vector。Vector是基于数组开发的可变长度的复合类型。由于它是基于数组开发的,所以数组有的功能它也有,我们只需要在创建箱子时添加vec宏,把数组箱子替换为Vector箱子就好了,其它代码不需要改动。
我们再运行看下效果, 这次命令行里成功输出了”现在有6条裤子“。
有同学可能会问既然Vector是基于数组开发的,数组的容量是不可变的那Vector是怎么做到容量可变的呢。
Vector是通过创建容量更大的新数组替换原来的数组做到看上去容量可变。什么意思呢?! 比如我们现在创建了一个有俩个元素的Vector.那Vector底层就会创建一个长度为2的数组保存这两个元素,当我们再往数组里添加另一个元素时,Vector就会创建一个长一点的数组,我们比方新创建了一个长度为4的新数组。Vector会把原来数组里的俩个元素移动到新数组里然后把新添加的元素放到新数组里。
这样,我们在使用Vector时就觉得它的容量是可变的了。
由于频繁的创建数组移动数据比较消耗性能,所以当我们知道或者能够预估元素的个数时,我们可以使用Vector的with_capacity方法设定Vector 创建的的数组大小,这样Vector内部就不需要频繁创建数组移动数据了。接下来我们使用代码直观的感受下。
使用cargo new 创建一个vector-test项目,进入项目目录,使用文本编辑器打开main.rs文件,删除掉不需要的代码,使用vec宏创建一个包含俩个元素的Vector,再使用for循环往vector里放入从1到9的9个数字。每次放入前,输出下vector的长度和容量。方便我们观察vector内部的变化。长度和容量有什么关系呢?!长度指vector里已经包含的元素的个数,容量指vector里能够包含的元素个数。如果把vector比作一个装裤子的箱子,那容量就是箱子能够装的裤子条数,长度就是你实际往里放的裤子条数。
编写好后 我们运行看下效果。
这里报了个错误,错误提示我们变量v是不可变的但我们却要改变它。我们忘记使用mut关键字了吧?我们添加mut关键字,再运行看下效果。
这次运行成功了,从输出的结果我们可以看出:刚创建时Vector的长度和容量一样都是2, 因为我们在创建时就放里了俩个元素。当往里放了第三个元素后,长度和容量就不一样了,长度是3容量变成了4,这说明vector内部已经重新创建了个数组。随着往里放的元素越来越多,vector的容量也越来越大,从这里的2,4,8,16我们可以看出每次扩容都是增大了一倍。
接下来我们在使用with capacity方法创建一个Vector. 我们往里放从1到9 共9个元素所以我们设置容量为10当然设置为9也可以。我们再运行看下效果,这里提示找不到Vector,这是因为我们应该用简写vec而不应该用vector. 修改好后保存退出,再运行看下效果。
这次输出的capacity都是10,也就是Vector内部没有发生频繁的创建数组移动数据。
大家可以自己复现下代码,感受一下。
内容根据视频整理,相应视频内容可访问
51cto学院:
免费进群交流
Don’t let your history control your destiny.
|
请发表评论