码迷,mamicode.com
首页 > 其他好文 > 详细

STL库初探

时间:2016-07-25 16:29:54      阅读:142      评论:0      收藏:0      [点我收藏+]

标签:stl

库:没错误,比框架小,用来解决小问题。

框架:解决开发中某个功能很全。

STL:标准规范,代码不一样,风格,框架有差异

包括:

    算法

    容器

STL包括:

  1. 容器:容纳数据的结构

  2. 迭代器:扮演容器和算法的胶合剂

  3. 空间配置器:内存空间(动态分配)的分配与管理

  4. 配接器:一种修饰容器的东西:stack,queue,eg:反向迭代器

    更约束,不支持遍历

  5. 算法#include<algorithm>

  6. 仿函数


技术分享

迭代器:指向一个迭代器,类似指针(一个类型封装的指针)

迭代器失效:类似野指针,和删除有关

erase参数

    1.一个位置(迭代器)

    2.位置区域(迭代器)


迭代器(iterator)是一个可以对其执行类似指针的操作(如:解除引用(operator*())和递增(operator++()))的对象,我们可以将它理解成为一个指针。但它又不是我们所谓普通的指针,我们可以称之为广义指针,你可以通过sizeof(vector::iterator)来查看,所占内存并不是4个字节。


    首先对于vector而言,添加和删除操作可能使容器的部分或者全部迭代器失效。那为什么迭代器会失效呢?vector元素在内存中是顺序存储,试想:如果当前容器中已经存在了10个元素,现在又要添加一个元素到容器中,但是内存中紧跟在这10个元素后面没有一个空闲空间,而vector的元素必须顺序存储一边索引访问,所以我们不能在内存中随便找个地方存储这个元素。于是vector必须重新分配存储空间,用来存放原来的元素以及新添加的元素:存放在旧存储空间的元素被复制到新的存储空间里,接着插入新的元素,最后撤销旧的存储空间。这种情况发生,一定会导致vector容器的所有迭代器都失效。


我们看到实现上述所说的分配和撤销内存空间的方式以实现vector的自增长性,效率是极其低下的。为了使vector容器实现快速的内存分配,实际分配的容器会比当前所需的空间多一些,vector容器预留了这些额外的存储区,用来存放新添加的元素,而不需要每次都重新分配新的存储空间。你可以从vector里实现capacity和reserve成员可以看出这种机制。


    capacity和size的区别:size是容器当前拥有的元素个数,而capacity则指容器在必须分配新存储空间之前可以存储的元素总数。


    vector迭代器的几种失效的情况: 1.当插入(push_back)一个元素后,end操作返回的迭代器肯定失效。 2.当插入(push_back)一个元素后,capacity返回值与没有插入元素之前相比有改变,则需要重新加载整个容器,此时first和end操作返回的迭代器都会失效。 3.当进行删除操作(erase,pop_back)后,指向删除点的迭代器全部失效;指向删除点后面的元素的迭代器也将全部失效。


    deque迭代器的失效情况: 在C++Primer一书中是这样限定的: 1.在deque容器首部或者尾部插入元素不会使得任何迭代器失效。 2.在其首部或尾部删除元素则只会使指向被删除元素的迭代器失效。 3.在deque容器的任何其他位置的插入和删除操作将使指向该容器元素的所有迭代器失效

本文出自 “小止” 博客,请务必保留此出处http://10541556.blog.51cto.com/10531556/1829674

STL库初探

标签:stl

原文地址:http://10541556.blog.51cto.com/10531556/1829674

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!