我是靠谱客的博主 糟糕歌曲,最近开发中收集的这篇文章主要介绍vector中的 size和 capacity和 reserve和 resize,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

在vector中与size()和capacity() 相对应的有两个函数:resize(size_type)和reserve(size_type)。

微笑Size指目前容器中实际有多少元素,对应的resize(size_type)会在容器尾添加或删除一些元素,来调整容器中实际的内容,使容器达到指定的大小。

微笑Capacity指最少要多少元素才会使其容量重新分配,对应reserve(size_type new_size)会这置这个capacity值,使它不小于所指定的new_size。

所以用reserve(size_type)只是扩大capacity值,这些内存空间可能还是“野”的,如果此时使用“[ ]”来访问,则可能会越界。而resize(size_type new_size)会真正使容器具有new_size个对象。在对vector进行访问时,如果使用“[ ]”,则会像变通数组那样,不进行越界的判断。如果使用“at(size_type)”函数则会先进行越界的判断,例如下面两断程序:

程序1、

vector<int> v;
v.reserve(2);
v[0]=1;
cout << v[0] << endl;

程序2、

vector<int> v;
v.reserve(2);
v.at(0)=1;
cout << v.at(0) << endl;

两段程序编译都正常,执行时程序一会输出1。

这是一个很危险的动作,因为v[0]这块内存还是“野”的。而程序二则会收到一条“std::out_of_range”异常,因为“at size_type)”函数会进行进行下标越界的检查,来保证程序的安全。此时vector的size()为0,其中并没有对象,所以对第0个对象的访问是越界的。

结合下面的程序可以更入的理解程序一中的问题。

程序3、

vector<int> v;
v.reserve(2);
v[0]=1;
cout << v[0] << endl;
v.reserve(3);
cout << v[0] << endl;

输出结果是

1

-842151451

原因很简单,虽然reserve(2)使vector容量扩展成至少为2,但是这些空间都是空的,也就是v[0]还是一块“野”内存。所以在使用reserve(3)扩展capacity时,得到的新空间里什么都没有。

 

总结:

1. operator[]和at()只能支改动那些确实存在于容器中的元素,不能自动使容器产生新元素。

2. at()提供了越界检查的功能,使用起来更安全,同时比起operator[]来代价也更大。

3. reserve()只能扩展容器的capacity,不会在其中加入元素。对于reserve()扩展的空间,可以使用push_back(const T&)来填入对象。

转自:http://blog.163.com/jxguo_05/blog/static/719401002010102523831645/

最后

以上就是糟糕歌曲为你收集整理的vector中的 size和 capacity和 reserve和 resize的全部内容,希望文章能够帮你解决vector中的 size和 capacity和 reserve和 resize所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(47)

评论列表共有 0 条评论

立即
投稿
返回
顶部