<<C++标准程序库>>中的STL简单学习笔记

0. 内容为个人学习笔记, 仅供参考, 如有错漏, 欢迎指正!

1. STL中的所有组件都是由模板构成的, 所以其元素可以是任意型别的. 组件有:

  - 容器: 管理某类对象的集合. 不同的容器有各自的优缺点.

  - 迭代器: 用来在一个对象集群(Collection of Objects) 的元素上进行遍历. 这个CoB可以是容器/容器的一部分. 每种容器都提供了自己的迭代器.

  - 算法(Algorithm): 用来处理集群内的元素(比如: 查询,修改,排序等).

  - 适配器(adapter)

  - 仿函数(functors or function objects)

2. STL基本观念是将数据和操作分离, 数据交给容器进行管理, 操作(算法)可以定制算法, 使用迭代器来提供两者间统一的接口.

  - STL 的概念有点儿和OOP的最初思想矛盾, 然而这个小框架提供了很好的容器/算法弹性.

  - STL 是泛型编程的出色范例, 容器和算法对任意型别和类别而已已经一般化了.

  - STL 提供了适配器和仿函数可以实现对算法的: 补充, 约束 和定制, 从而满足不同的需求.

3. 容器

  - 序列式容器(Sequence container): 可序集群.(3个)  ---- vector/deque/list (为什么queue,stack 和 string不是呢?)

    - 可以将strings 和 array 也当作是一种序列式容器(why?)

    - array 是C/C++语言核心所支持的一个型别(type), 而不是(class). 具有静态大小和动态大小. 但它也并不是STL容器. 因为没有类似size(),empty()等成员函数. 但是STL的设计又允许它调用STL算法. 当我们以static arrays作为初始化行时特别有用.

    - 没有必要直接编写dynamic array了, 因为可以用vector实现.

  - 关联式容器(Association container): 已序集群(4个). 排序和元素值,插入顺序无关. ---- set/multiset/map/multimap

    - 自动会对元素进行排序. 默认情况下是使用 operator < 进行比较.

    - 一般关联容器由二叉搜索树实现 , 各容器的主要差别在于元素的类型已经处理重复元素的方式.

    - set: 按内部元素的值进行排序, 不允许重复.

    - multiset: 和set相同, 但允许重复

    - map: key/values , 键不允许重复.

    - multimap: 和map一样, 但键允许重复.可以用来当做字典.

4. 容器适配器

  - stack: FILO

  - queue: FIFO

  - priority_queue: 下一个出队的元素永远是具有最高优先级的元素  ( 默认比较是 operator < 所以数值越小,优先级越高? ).

5. 迭代器(基本操作)

  - operator */++/==/!=/=

  - 每种容器都必须提供自己的内部类, 事实上每种容器都将其适配器定义为内部类.

  - 任何一种容器都有2种类别的迭代器

    - container::iterator

    - container::const_iterator

6. 关联式容器的一些应用

  -  typedef set<int> IntSet;  /  typedef set<int, greater<int> >IntSet;  greater<> 是一个预先定义的仿函数.

  - 所有的关联容器都有一个insert()方法, 但是没有序列式容器的push_back(),push_front()方法 , 因为你没有权力指定新元素的位置.

  - map 允许使用  operator []  来安插元素. 而multimap不允许使用下标操作符(因为key可以重复哦).

  - 存取multimap或map的元素时, 必须用pair结构的first和second成员才能访问到具体key/value

 1 #include <iostream>
 2 #include <map>
 3 #include <string>
 4 using namespace std;
 5 int main(){
 6     typedef map<string,float> StringFloatMap;
 7     StringFloatMap coll;
 8     coll["VAT"] = 0.15;
 9     coll["pi"] = 3.14;
10     coll["This is a string"] = 3.4;
11     coll["NULL"] = 0;
12     StringFloatMap::iterator it = coll.begin(); // map 是不能手动排序,但是并不是没有序
13     for(;it!=coll.end();++it){ // 使用++it效率高于 it++
14         cout<<it->first<<" : "<<it->second<<endl;
15     }
16     return 0;
17 }

7. 迭代器分类(2种)

  - 双向迭代器(Bidirectional iterator): list/set/multiset/map/multiset提供的属于此类.

  - 随机存取迭代器(Random access iterator): vector/deque/strings提供的属于此类. 随机访问迭代器可以支持  operator <

8. 算法

  - 不是容器的成员函数, 而是搭配迭代器使用的全局函数.

  -  pos = min_element(coll.begin(),coll.end())   /   pos = max_element(coll.begin(),coll.end())

  -  sort(coll.begin(),coll.end()[,comp]);

  -  pos = find(coll.begin(),coll.end(),value);

  -  reserve(pos,coll.end())

时间: 2024-10-12 19:59:43

<<C++标准程序库>>中的STL简单学习笔记的相关文章

JavaSE中Collection集合框架学习笔记(2)——拒绝重复内容的Set和支持队列操作的Queue

前言:俗话说“金三银四铜五”,不知道我要在这段时间找工作会不会很艰难.不管了,工作三年之后就当给自己放个暑假. 面试当中Collection(集合)是基础重点.我在网上看了几篇讲Collection的文章,大多都是以罗列记忆点的形式书写的,没有谈论实现细节和逻辑原理.作为个人笔记无可厚非,但是并不利于他人学习.希望能通过这种比较“费劲”的讲解,帮助我自己.也帮助读者们更好地学习Java.掌握Java. 无论你跟我一样需要应聘,还是说在校学生学习Java基础,都对入门和进一步启发学习有所帮助.(关

Log4j简单学习笔记

log4j结构图: 结构图展现出了log4j的主结构.logger:表示记录器,即数据来源:appender:输出源,即输出方式(如:控制台.文件...)layout:输出布局 Logger机滤器:常用级别的划分:Debug,Info,Warn,Error,Fatal这5个级别由低到高,如果配置的级别为"INFO"那么"Debug"级别的信息则不会显示"依次类推. 示例代码: @Test public void testLevel() { log.debu

C#中的委托、事件学习笔记

1.委托delegate 委托delegate也是一种类型,在任何可以声明类的地方都可以声明委托,它将方法当做另一个方法的参数进行传递,这样就可以传递不同的方法,完成不同的功能,使程序具有很好的可扩展性. 举例: 假设这里有一台电脑,有人会用它写程序,有人会用它打游戏,有人会用它看电影,有人会用它边听音乐边玩游戏,有人会用它边听音乐边看文档,边上QQ. 这台电脑可以抽象成一个类Computer,里面有个方法DoWork,所有的人都要通过这个方法来做自己的事情. 不用委托的时候我们可以实现一些固定

JavaSE中Collection集合框架学习笔记(3)——遍历对象的Iterator和收集对象后的排序

前言:暑期应该开始了,因为小区对面的小学这两天早上都没有像以往那样一到七八点钟就人声喧闹.车水马龙. 前两篇文章介绍了Collection框架的主要接口和常用类,例如List.Set.Queue,和ArrayList.HashSet.LinkedList等等.根据核心框架图,相信我们都已经对Collection这个JavaSE中最常用API之一有一个较为全面的认识. 这个学习过程,还可以推及到其他常用开源框架和公司项目的学习和熟悉上面.借助开发工具或说明文档,先是对项目整体有一个宏观的认识,再根

CSS中filter滤镜的学习笔记

1.CSS静态滤镜样式 (filter)(只有IE4.0以上支持)  CSS静态滤镜样式的使用方法:{ filter : filtername( parameters1, parameters2, ...) } Filter样式 简要说明 支持参数 alpha 设置图片或文字的不透明度 opacity.finishOpacity.style.startX.startY.finishX.finishY.add.direction.strength blur 在指定的方向和位置上产生动感模糊效果 a

JavaSE中Collection集合框架学习笔记(1)——具有索引的List

前言:因为最近要重新找工作,Collection(集合)是面试中出现频率非常高的基础考察点,所以好好恶补了一番. 复习过程中深感之前的学习不系统,而且不能再像刚毕业那样死背面试题,例如:String是固定长度的,StringBuffer和StringBuilder的长度是可以变化的.如果一旦问得深入一点,问为什么有这样的区别就傻眼了,只能一脸呆萌地看着面试官. 因此想要通过写文章的形式,系统地总结学习的内容,例如Collection架构是怎样的.有哪些相关的继承和接口实现,这样才能了解什么时候应

JS和JQuery中的事件委托 学习笔记

事件委托其实并不是一个很高级的技巧,比如在一个页面里面,当只存在两个按钮的时候,可能你给按钮添加监听是这样的:(本文不考虑浏览器兼容性,关于事件的兼容性可参考前面的学习笔记) <div id="container"> <button id="btn1">按钮1</button> <button id="btn2">按钮2</button> </div> var btn1 =

DFS中的奇偶剪枝学习笔记

奇偶剪枝学习笔记 描述 编辑 现假设起点为(sx,sy),终点为(ex,ey),给定t步恰好走到终点, s | | | + — — — e 如图所示(“|”竖走,“—”横走,“+”转弯),易证abs(ex-sx)+abs(ey-sy)为此问题类中任意情况下,起点到终点的最短步数,记做step,此处step1=8: s — — — — — + | + | + — — — e 如图,为一般情况下非最短路径的任意走法举例,step2=14: step2-step1=6,偏移路径为6,偶数(易证): 结

C++中临时对象的学习笔记

http://www.cppblog.com/besterChen/category/9573.html 所属分类: C/C++/STL/boost 在函数调用的时候,无论是参数为对象还是返回一个对象,都将产生一个临时对象.这个笔记就是为了学习这个临时对象的产生过程而写. 本代码的详细例子见实例代码Ex.01 Ok,先让我们定义一个类: class CExample { public: int m_nFirstNum; int m_nSecNum; int GetSum(); bool SetN