STL::vector的源码学习

最近准备把stl好好看看,对数据结构和算法加深理解,选择的是侯捷的《STL源码剖析》。

先把一些思路片段纪录下来,回头整理。

1. front(), back() 和 pop_back() 函数不是很安全,

#include<vector>
#include<iostream>

using namespace std;


int main()
{
        vector<int> ivec;
        cout << "size =" << ivec.size() << endl;
        cout << "capacity = " << ivec.capacity() << endl;
        ivec.pop_back();
        cout << "after pop_back: " << endl;
        cout << "size =" << ivec.size() << endl;
        cout << "capacity = " << ivec.capacity() << endl;
        cout << "test" << endl;
        cout << "front = " << ivec.front() << endl;
        cout << "back() = " << ivec.back() << endl;
        return 0;
}

<span style="font-family: Arial, Helvetica, sans-serif;">上面</span><span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">的代码例子会导致,内存泄漏。输出结果为:</span>

size =0
capacity = 0
size =18446744073709551615 //pop_back导致finish指针越界
capacity = 0
test
段错误 (core dumped) //front,back 内存错误

2. vector 是个顺序的序列,跟array很像,但是vector 实现l了对用户来说,空间操作是无限的概念,不用管先要申请一片空间,再在插入数据过程中空间够不够,需不需要再申请,偶外的空间还需要数据移动。

这些vector 都给你做好了,只需要push_back, 和insert就可以了。


3. 使用vector性能分析

在使用vector插入数据的时候,发现性能不是很好,来看下push_back的代码:

void push_back(const T& x){
    if (finish != end_of_storage){
         construct(finish, x);
         ++ finish;
     }
     else
         insert_aux(end(), x);
}

push_back的时候都会调用construct函数,拷贝构造函数的性能一般都不是很好,因为他需要复制一个结构体。

这个时候可以考虑使用一个指针,这样 construct的时候,只需要复制指针就可以了。

但是这个有个麻烦就是,需要你自己释放这个指针所对应的对象。


4. vector的空间默认是两倍于当前空间的申请

这样设计也是为了性能考虑,频繁的申请空间和移动元素很耗性能。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值