一、 resize和reserve 因两接口的源代码相当精简,以至于可以在这里贴上它们: vector在push_back的时候,如果空间不足,会自动增补一些空间,如果没有预留的空间可用 就直接申请另一块可用的连续的空间,把数据拷贝过去,然后删除旧空间,使用新空间 结果造成效率低下 如果在事先预见到有较大空间需求,就可以先用reserve预留一定的空间,避免内存重复分配和 大量的数据搬移。提高了效率 size指的是除去预留的额外空间的所有用来存放数据的空间,resize也好理解,如果说你对某部分 没有进行初始化(比如原本的size是100,现在resize为200个),那就给其余100个调用默认构造函数, 如果是内置类型,初始化为0——我对初始化内置类型这点不是特别肯定,你可以查资料). capacity返回的是包括预留的空间在内的所有空间大小,通常跟reserve的那个大小相当,否则根据分配策略获得。capacity的正式定义为:在不需要重新分配空间的情况下,vector能容纳的元素的最大数量 举例说: vector <int> v.reserve(16); assert(v.capacity()==16); vector <int> cout Q1. Q2. A2: vector, deque和list都提供了resize()这个函数来重设元素个数. 对于新增加的元素怎么初始化,resize通过第2个参数说明. 好了, size()和resize()清楚后,再来看看 reserve()和capacity(), 他是vector特有的,也是由vector的特性所决定的. 假如当vector中可能会存在约500个元素时, 比较两种做法: 1. vector<int> myVec, 然后500次调用 myVec.push_back(****) 2. vector<int> myVec(500), 然后500次调用 myVec.push_back(****) 做法2只需要进行1到2次内存分配,而做法1不知道要进行多少次内存分配了. 现在, 同样,两个问题: Q1. 当前容器预留了多大空间(在不进行重新分配内存的前提下,最多可以容纳多少个元素)? Q2. 怎样重设当前容器的预留大小? A1: capacity(). A2: reserve(). 辨析: 所以说resize()和reserve根本是两回事,resize影响元素的个数. reserve只分配预留的空间. 所以 capacity() >= size() 恒成立. 另外有几个问题: 1. vector<int> a(10); 2. 假设vector<int> sample; 当前size()为50, capacity()为100,经过以下操作: (1) resize(10). (2) resize(60). (3) resize(60, 9999). (4) resize(200). //size() == 200; 50到199下载用默认构造函数填充. capacity() == 200, 自动扩容,重新分配内存. (6) reserve(60). //size() == 50; 元素没有变, capacity() == 100, 不变. 即reserve调用没起作用. (7) reserve(200). //size() == 50; 元素没有变, capacity() == 200, 扩容,重新分配内存. 3. vector<int> sample(10); sample.push_back(999); //size() == 11; reserve () == 15; //自动扩容, reseve为什么不是11呢? 这个超余量是不一定的,也不一定是15. |
|