C++ STL vector容器详解——(2)push_back()剖析、vector的n倍增长特性与vector迭代器

1.push_back()

push_back()函数用来往vector的末尾插入新元素,它的具体实现源码如下(基于G2.9):

 

1.push_back函数首先会检查是否还有空间,有就插入,没有就调用insert_aux

2.insert_aux也会先做一次剩余空间判断,这是因为调用该函数的不止push_back,可能存在其他插入函数没有做剩余空间检查。如果没有剩余空间,则根据原大小的n倍来计算新空间的大小,然后在内存中找到可以存放这个大小内容的空间。(这就是vector的n倍增长特性)

3.insert_aux找到新空间后会先把原地址的内容拷贝到新空间,再插入新元素,最后将原地址插入点后的内容也拷贝过去。同样也是因为调用该函数的不止vector容器,有些容器可以在中间插入,则需要将前后内容都拷贝。

4.最后将源地址空间的内容逐个释放。

由此可以看出vector的使用非常简单友好,但是存在大量拷贝和释放操作,也就是会不断地调用拷贝构造函数和析构函数,在使用vector时需要考虑到这个成本。

2.vector的迭代器

vector的结构是连续的,vector迭代器所需要的操作普通指针就可以做到,因此不需要特别的写一个智能指针(迭代器)。

根据之前学习的Iterator Traits(萃取机),vector的迭代器将通过普通指针的偏特化版本iterator_traits<T*>来回答五个问题。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值