码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2015-10-18 06:38:11      阅读:254      评论:0      收藏:0      [点我收藏+]

标签:

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 }
View Code

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()) 

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

标签:

原文地址:http://www.cnblogs.com/roger9567/p/4888770.html

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