您的位置首页百科知识

vector 在c++中resize 和reserve的区别

vector 在c++中resize 和reserve的区别

的有关信息介绍如下:

vector 在c++中resize 和reserve的区别

resize就是重新分配大小,reserve就是预留一定的空间。这两个接口即存在差别,也有共同点。下面就它们的细节进行分析。 为实现resize的语义,resize接口做了两个保证: 一是保证区间[0, new_size)范围内数据有效,如果下标index在此区间内,vector[indext]是合法的。 二是保证区间[0, new_size)范围以外数据无效,如果下标index在区间外,vector[indext]是非法的。 reserve只是保证vector的空间大小(capacity)最少达到它的参数所指定的大小n。在区间[0, n)范围内,如果下标是index,vector[index]这种访问有可能是合法的,也有可能是非法的,视具体情况而定。 resize和reserve接口的共同点是它们都保证了vector的空间大小(capacity)最少达到它的参数所指定的大小。因两接口的源代码相当精简,以至于可以在这里贴上它们: void resize(size_type new_size) { resize(new_size, T()); } void resize(size_type new_size, const T& x) { if (new_size < size()) erase(begin() + new_size, end()); // erase区间范围以外的数据,确保区间以外的数据无效 else insert(end(), new_size - size(), x); // 填补区间范围内空缺的数据,确保区间内的数据有效 } void reserve(size_type n) { if (capacity() < n) { const size_type old_size = size(); iterator tmp = allocate_and_copy(n, start, finish); destroy(start, finish); deallocate(); start = tmp; finish = tmp + old_size; end_of_storage = start + n; } }二、vector在push_back的时候,如果空间不足,会自动增补一些空间,如果没有预留的空间可用 就直接申请另一块可用的连续的空间,把数据拷贝过去,然后删除旧空间,使用新空间 结果造成效率低下 如果在事先预见到有较大空间需求,就可以先用reserve预留一定的空间,避免内存重复分配和 大量的数据搬移。提高了效率 size指的是除去预留的额外空间的所有用来存放数据的空间,resize也好理解,如果说你对某部分 没有进行初始化(比如原本的size是100,现在resize为200个),那就给其余100个调用默认构造函数, 如果是内置类型,初始化为0——我对初始化内置类型这点不是特别肯定,你可以查资料). capacity返回的是包括预留的空间在内的所有空间大小,通常跟reserve的那个大小相当,否则根据分配策略获得。capacity的正式定义为:在不需要重新分配空间的情况下,vector能容纳的元素的最大数量 举例说: vector v; v.reserve(16); assert(v.capacity()==16); vector v; cout < < v.capacity(); //这里就依赖于库的实现,