earse
earse时整个数组向前移所以在vector上的迭代器都失效,故需每个迭代器–it下才能正常使用。
resize(nums),实际vector的有效元素变为nums个并初始化为0。这时再push_back就在nums后面插入了。
push_back ,insert 可能造成迭代器失效
resize
resize 比当前容量大时,底层重新申请内存,所以迭代器也会失效
reserve
reserve只能扩大不能扩小,当小于等于当前容量时,函数会相当于没有调用,如果我们想释放多余vector容量
- 定义一个tmp vector,然后使用vector的 swap函数交换下即可
- 使用c++11的专门释放内存的函数
关于push_back
push_back的时候,会判断当前容量是否足够,不足够会申请一段新的空间,然后把原先的元素(size大小的所有元素)通过 inplacement new 的copy构造的方式拷贝到新空间上,然后再把尾插的元素也以inplacement new 的方式构造到新的空间处。如果空间足够,使用就在finish指针指向的空间调用 inplacement new 以 copy构造的方式构造新的对象。所以它的push_back 是均摊的O(1) 。
construct
vector v(100) ,它会生成一个有效元素为100个的vector,并且每个元素内容都是T()的内容。所以这个参数n指的是有效元素个数而并非容量。如果想提高push_back的效率,不想边插边扩容,可以考虑reserve。
reserve
reserve会把原先的有效元素(SIZE)构造到新空间,然后容量扩充为新申请空间大小。它跟resize最大区别在于它比resize性能更高。如果你想扩容,你调的是resize ,那么vector不止会申请你想要的内存,还会调用 inplacement new 来初始化这段空间,而reserve只申请空间
尾插论 resize(resize()+1) 与 push_back(T()) 效率
当我们有的时候想往vector尾插一个默认元素的时候,可以resize(resize+1) 与 push_back(T()) 。在size大小小于容量的情况下, resize 会拿你传入的大小和对象去初始化内存,如果你没有传入那么默认是T(),因为它是值传递所以必定发生一次copy。开始的时候resize 会把最后一个元素copy到end处,然后再把传入的value再诺到end+1出发生了3次copy。而push_back 根据置位new来copy只发生1次。