effective stl 笔记

来源:互联网 发布:eml文件怎么打开 mac 编辑:程序博客网 时间:2024/05/16 13:40

vector和string

    第二大章主要讲的是vector和string这两种stl的使用。这两种stl都是continue-stored的方式来组织数据的,特别是vector更是提供了和数组非常相似行为。

    两者都可以替换标准C语言中的array,作者在第二章的第一节就说明了用这两种stl代替标准array的好处。首先,它们简化了new和delete[]这样的操作,由系统自己来管理元素空间的申请与释放,从而降低了空间浪费和memory leak的可能性;其次,stl提供了很多标准array没有提供的功能,尤其是能安全的进行元素的遍历而不用担心越界的问题。作者在这一节中到了string在多线程程序中使用会遇到的问题,因为string的使用计数功能(相同内容的string指向同一个内存区域)可能在多线程环境下被破坏而造成不可预料的后果,所以在多线程的环境下要关闭string的使用计数功能。

    使用push_back,可以向vector的尾部插入数据。 当vector中的数据达到了目前其申请的内存大小的时候,vector通过自增长的方式来使自己的容量加倍,也就是说如果要插入N个数据那么vector大约要自增lnN次。在自增的时候要进行新空间的申请,数据的转移,旧数据的销毁和旧空间的释放等工作。对于N很大的时候这也是一项不小的开销。可以使用reserve命令来手动的为vector分配空间,当预先知道数据的数目是,可以直接设置vector的容量,这样一次就将空间分配完了。如果时间不知道的话,可以现吧vector的空间大小设置为最大值,在对数据进行插入后再将空间调整为适当的大小。可以使用size()(vector中现有现有元素的数目)和capacity()(vector中可以容纳的元素数目)来计算剩余的空间。

    string的实现是第三节讨论的主题。这里列举的四种string实现方式都满足了string的功能要求,但是在构造上却各有千秋。这些差异主要体现在size,capacity和使用计数的位置和string包含数据的结尾判断上。

    vecotr和string还可以通过vector::operator[]和string::c_str()来将自己转化为指针,从而让C程序使用。

    利用像vector<>(v).swap(v)的手段可以剪裁掉v中多余的空间,并且不会使iterator失效。

    vector<bool>是一个需要注意的stl,因为它并不以bool变量作为其操作的最小单位,而是将所有二进制数据作为一个整体来看待。使用vector<bool> v; bool *pb = &v[0];会发生编译错误,因为vector<bool>的operator[]返回的并不是bool型的引用。可以使用deque<bool>和bitset来实现bool型变量的集合存储。只是deque<bool>不能转化为数组的指针,因为deque是链式存储的;而bitset不支持插入和删除也不支持iterator(原始的东东)。

原创粉丝点击