vector中的size和capacity
来源:互联网 发布:dota2数据查询网站 编辑:程序博客网 时间:2024/04/29 20:30
原文地址——诸葛半里
==============================================
在vector中与size()和capacity() 相对应的有两个函数:resize(size_type)和reserve(size_type)。
Size
size指目前容器中实际有多少元素,对应的resize(size_type)会在容器尾添加或删除一些元素,来调整容器中实际的内容,使容器达到指定的大小。
Capacity
Capacity指最少要多少元素才会使其容量重新分配,对应reserve(size_type new_size)会这置这个capacity值,使它不小于所指定的new_size。
所以用reserve(size_type)只是扩大capacity值,这些内存空间可能还是“野”的,如果此时使用“[ ]”来访问,则可能会越界。而resize(size_type new_size)会真正使容器具有new_size个对象。
区别
在对vector进行访问时,如果使用“[ ]”,则会像变通数组那样,不进行越界的判断。
如果使用“at(size_type)”函数则会先进行越界的判断。例如下面两断程序:
程序一:
</pre><pre name="code" class="cpp">vector<int> v; v.reserve(2); v[0]=1; cout << v[0] << endl;
程序二:
vector<int> v; v.reserve(2); v.at(0)=1; cout << v.at(0) << endl;
两段程序编译都正常。
但是对于程序1:虽然输出1,但这是一个很危险的动作,因为v[0]这块内存还是“野”的。
而程序二则会收到一条“std::out_of_range”异常,因为“at(size_type)”函数会进行进行下标越界的检查,来保证程序的安全。此时vector的size()为0,其中并没有对象,所以对第0个对象的访问是越界的。
结合下面的程序可以更入的理解程序一中的问题。
程序三:
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&)来填入对象。
- vector中的size和capacity
- vector中的size和capacity
- vector.size()和vector.capacity
- vector的capacity和size
- vector中的 size和 capacity和 reserve和 resize
- vector中的capacity、size的区别
- STL中的capacity和size
- vector的size、capacity和max_size
- vector 中 size()和 capacity()的区别
- Vector 中size和 capacity的区别
- Vector的size和capacity的区别
- C++的vector中的resize,reserve,size(),capacity()
- vector的reserve和resize以及capacity和size
- vector里的capacity和size的区别
- vector中capacity()和size()有什么不同?
- 关于vector大小(size)和容量(capacity)总结
- C++ STL之 vector的capacity和size属性区别
- C++ vector中size/resize和capacity/reserve的区别
- if __name__ == "__main__"
- 基于WEB的两种空格, 在做服务端处理时,要做特殊处理。
- JAVA面试常见的推理题
- duilib鼠标键盘消息处理
- max_prepared_stmt_count
- vector中的size和capacity
- Eclipse下Android项目包名的替换
- mapreduce编程(二)- 大象书中求每一年的最高温度
- sql 查询多项内容,要求某个字段内容不重复 及查某字段 重复的记录
- adb命令
- UIImagePickerController详解
- SQL学习网址
- 因为曾经是朋友
- Mel Quick Reference I