STL 概述

STL概述

STL头文件和容器类

#include        Container Class    
<deque>       deque
<list>        list
<map>        map, multimap
<queue>       queue, priority_queue
<set>         set, multiset
<stack>        stack
<vector>       vector

相关重要概念

  • 尽管具有多重继承的基于对象的层次结构在观念上是最直接的,但是在实际上较为困难.基于对象层次的一种更可取的选择:包容器类被作为参数化类型的大型预处理宏,而不是带自变量的模板,这些自变量能为我们所希望的类型代替
  • 对其进行简化并将它从预处理范围移入了编译器,这种新的代码替换装置被称为模板,而且它表现了完全不同的代码重用方法,模板对源代码进行复用,而不是通过继承和组合重用对象代码,当用户使用模板时,参数由编译器来替换,这非常像原来的宏方法,却更清晰,更容易使用
  • 模板使用类和函数可在编译时定义所需要处理和返回的数据类型,一个模板并非一个实实在在的类或函数,仅仅是一个类或函数的描述.由于模板可以实现逻辑相同,数据类型不同的程序代码复制,所以使用模板机制可以减轻编程和维护的工作量和难度.模板一般为函数模板,和类模板,函数模板定义了参数化的非成员函数,这使得程序员能够用不同类型的参数调用相同的函数,由编译器决定该用那一种类型,并且从模板函数中生成相应代码,所以只要类型不一样,但是处理上是完全相同的,这时可以使用函数模板

STL 的五大部分

  • 迭代器(iterators)
  • 算法(algorithms)
  • 容器(containers)
  • 函数对象(function objects)
  • 内存分配(allocators)

函数模板功能非常强大,但是有时候可能会陷入困境,假如待比较的函数模板没有提供正确的操作符,则程序不会对此进行编译,可以使用函数模板与同名的非模板函数重载,这就是函数的制定.函数模板与同名的非模板函数重载必须遵循以下的规则

  • 寻找一个参数完全匹配的函数,如果找到就调用它;
  • 如果失败,寻找一个函数模板,使其实例化,产生一个匹配的模板函数,如果找到了,就调用它
  • 如果失败了,再试低一级的对函数重载的方法,例如通过类型转换可产生的参数匹配等,如果找到了匹配的函数,就调用它
  • 如果失败了,则证明这是一个错误调用

模板中的友元函数

  • 非模板函数,类成员所有实例的友元
  • 模板函数,模板类成为同类型实例的友元
  • 模板函数,类成为不同类型实例类的友元

STL 的容器

说明:

  • vector<T>       是一种大小不可变的向量
  • list<T>          是一个双向链表容器
  • queue<T>       是一种队列容器
  • stack<T>         是一种栈容器
  • deque<T>       是一种双端队列容器
  • priority_queue<T>   是一种按值排序的队列容器
  • set<T>          是一种集合容器
  • multiset<T>       是一种充许出现重复元素的集合容器
  • map<key,val>      是一种关联数组容器
  • multimap<key,val>   是一种充许出现重复key值的关联容器

图释
STL 概述_第1张图片

迭代器

简介:

无论从何种意义上来说,都可以认为迭代器就是一个指示器,然而,迭代器技术能够使程序反复对STL容器的内容进行访问,所以非常快捷和重要,对容器的内容进行反复地访问,意味着一次就可以访问一个或多个元素

分类:

  • 输入迭代器:     主要用于为程序中需要的数据源提供输入接口,这里所指的数据源可以是容器,数据流等,输入迭代器只能够一个序列读入数据,这种迭代器可以被修改,并且以并进行比较
  • 输出迭代器:     主要用于输出程序中已得到的数据结果,这里指的结果可以是容器,数据流等,输出迭代器只能够向一个序列写入数据,这种迭代器可以被修改和引用
  • 向前迭代器:     可以随意访问序列中的元素,许多STL算法函数需要提供向前迭代器,向前迭代器既可以用来读也可以用来写,这种迭代器结合了输入输出迭代器的功能,并且能够保证迭代器的值,以便从起原先位置开始重新遍历
  • 随机接入迭代器:    可以通过跳跃的方式访问容器中得任意数据,从而使数据的访问非常灵活,随机访问迭代器作为功能最强大的迭代器类型,具有双向迭代器的所有功能,并且能够灵活使用算法和所有的迭代器比较功能

说明:

  • 迭代器的出现让算法和容器的分离成为可能,算法是模板,器类型依赖于迭代器,因此不会局限于单一的容器
  • 不同的STL算法需要不同类型的迭代器来实现相应的功能,因为不同类型的STL容器支持不同类型的迭代器,所以不能对所有的容器使用相同的算法

区别:

迭代器类型                 迭代器能力       支持的容器类型        
输入迭代器(input iterator)         向前读取能力      istream
输出迭代器(output iterator)        向前写能力       ostream,inserter
向前迭代器(forward iterator)         向前读和写能力     -
双向迭代器(Bidirectional iterator)     向前和方向读和写能力  list,set,multiset,map,multimap
随机访问迭代器(Random access iterator)  随机读和写能力    vector,deque,string等

你可能感兴趣的:(STL 概述)