文档章节

Effective STL - 容器

積木leayn
 積木leayn
发布于 2013/10/07 16:02
字数 1021
阅读 149
收藏 5

STL(standard template library)提供了一组表示容器,迭代器,函数对象和算法的模板。容器是一个与数组类似的单元,可以存若干个值。

STL容器是同质的,即存储的值的类型相同;算法是完成特定任务的处方;迭代器是能够用来遍历容器的对象,与能够遍历数组的指针类似,是广义指针;函数对象是类似于函数的对象,可以是类对象或函数指针(包括函数名,因为函数名被用作指针)。

STL不是面向对象编程,而是一种不同的编程模式-通用编程模式(generic programming)。

1. 慎重选择容器类型

  • 标准STL序列容器: vector, string, deque 和 list.
  • 标准STL关联容器:set, multiset, map 和 multimap.
  • 非标准序列容器slist 和 rope.
  • 非标准的关联容器 hash_set, hash_multiset, hash_map 和 hash_multimap.

  基于算法复杂性考虑:

    vector是默认应使用的序列类型;当需要频繁地在序列中间做插入和删除操作时,应使用list;当大多数插入和删除操作发生在序列的头部和尾部时,deque是应考虑的数据结构。

   STL一种分类方法:连续内存容器(contiguous-memory container)和 基于节点的容器(node-based container)。

 

2. vector 

   vector是一个能够存放任意类型的动态数组,能够增加和压缩数据。

  • 将元素置于一个动态数组中进行管理
  • 可以随机存取元素(用索引直接存取)
  • 在数组尾部添加或移除元素非常快速,但是在中部和头部安插元素比较费时

  使用说明:

  使用vector前,必须包含头文件<vector>

  例: vector<int> vec;

        操作:vec.size() //容器实际数据的个数

                vec.begin()//指向迭代器中的第一个数据地址

                vec.capacity() //返回容器中数据的个数

                vec.empty() //判断容器是否为空

                vec.front() //返回第一个数据

                vec.push_back(element) //在尾部加入一个元素

                vec.pop_back(element) //删除最后一个数据

                vec.end() //指向迭代器中末端的下一个,指向不存在元素

3. deque

    是一种具有队列和栈的性质的数据结构。

  • deque,是 double-ended queue 缩写
  • 可以随机存取元素(用索引直接存取)
  • 在数组尾部添加或移除元素非常快速,但是在中部和头部安插元素比较费时

4. list

  • 双向链表
  • 不提供随机存取(按顺序走到需要存取的元素,O(n))
  • 在任何位置插入和删除都非常迅速,内部只需调整一下指针

5.  iterator

  iterator(迭代器) 是一种对象,它能够用爱遍历标准模板库容器中的部分或全部元素,每个迭代器对象代表容器中的确定地址。迭代器修改了常规指针的接口。

  • 迭代器是一个所谓的智能指针,具有遍历复杂数据结构的能力。迭代器是一个“可遍历stl容器内全部或部分元素”的对象
  • 一个迭代器指出容器的一个特殊位置
  • 具有遍历复杂数据结构的能力

6. 容器的共通能力

   所有容器提供都是value语义,而非reference。容器执行插入元素的操作时,内部实施拷贝动作。所以STL容器内存储的元素必须能够被拷贝(必须提供拷贝构造函数)。

   每个容器都提供可返回迭代器的函数,运用返回的迭代器就可以访问元素。
  
通常STL不会丢出异常。要求使用运行者对确保传入正确的参数。

7. 容器的共通操作

   1) 与大小相关的操作函数

        c.size()  传回容器中的元素数量

        c.empty() 判断容器是否为空

        c.max_size() 传回元素最大可能数量

   2)返回迭代器的函数

        c.begin()

        c.end()

        c.rbegin()  返回一个逆向迭代器,指向逆向寻访时的第一元素

        c.rend()



© 著作权归作者所有

積木leayn
粉丝 1
博文 73
码字总数 39453
作品 0
西安
私信 提问
C++ noncopyable类

在muduo中,有一个类,继承了该类的派生类不能被拷贝,只能被移动。涉及拷贝的函数有两个:拷贝构造函数和拷贝复制操作符。将这两个方法声明为不可访问或者删除(=delete),即可达到不可拷贝...

chenBright
09/29
0
0
《Effective STL》读书总结--关于STL 你不一定都懂的

春节期间一次用手机上网无意间发现了这本书,说起来还得感谢智能手机的发展,有时候还是很方便的。当时随便的翻了几页,于是我停不下来了,因为我发现原来我不知道的东西太多了。 我第一次接...

长平狐
2012/06/08
155
0
C++各阶段学习书目

1. 入门 Lippman的《Essential C++》 顾名思义,这本书是很短小精悍的。通过这本书,可以对C++的最常用和重要的特性有全面的了解,并对C++的全貌有一个概念。虽然这远远不够,但就是这样的书...

晨曦之光
2012/04/24
567
1
001-EMC 深入解读-目录

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/q1007729991/article/details/82717008 除了刚毕业的应届生,从来没人敢说他精通 C++,Bjarne Stroustrup (C...

--Allen--
2018/09/15
0
0
C++ 书籍大汇

C++ 书籍大汇 C++ 书籍大汇 语言基础入门: 1. C++ Primer 《C++入门》(通常不用中文名) by Stanley B. Lippman 有第三版和第四版,如其名,是C++入门的不二选择,是全面广泛的参考书目,内...

长平狐
2012/09/20
314
0

没有更多内容

加载失败,请刷新页面

加载更多

001-ELKStack之Elasticearch

ELKStack 之 Elasticsearch ELK Stack 是 Elasticsearch、Logstash、Kibana 三个开源软件的组合。在实时数据检索和分析场合,三者通常是配合共用,而且又都先后归于 Elastic.co 公司名下,故...

伟大源于勇敢的开始
23分钟前
3
0
Kotlin基础语法学习

安装好安卓studio,以及插件支持Kotlin 就可以在创建项目的时候选择 Kotlin语言了。 https://www.jianshu.com/p/4ab13691d681 参考手册: https://www.runoob.com/kotlin/otlin-android-setu...

T型人才追梦者
今天
6
0
java实现简单计算器

1.概述 之前作者写过一篇文章,也是关于计算器的,用的是C++与Qt,链接在这里 这次用java的swing写的(这差距好像有点大,好吧是qt太强了). 先上图: 2.UI 总体布局使用流布局. (1)文本框 文本框就...

Blueeeeeee
今天
9
0
纯CSS实现DIV悬浮(固定位置)

纯CSS实现的DIV悬浮效果(固定位置),兼容常用的浏览器:IE8、360、FireFox、Chrome、Safari、Opera、傲游、搜狗、世界之窗等。效果如下: 实现代码: <!DOCTYPE html> <html> <head> <meta ...

独钓渔
今天
6
0
OSChina 周二乱弹 —— 给我来个女菩萨

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @这次装个文艺青年吧 :#今日歌曲推荐#分享XXXTENTACION/Travis Barker的单曲《Pain = BESTFRIEND》: 《Pain = BESTFRIEND》- XXXTENTACION/...

小小编辑
今天
181
4

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部