一、STL(Standard Template Library,标准模板库)
STL 从广义上分为: 容器(container) 算法(algorithm) 迭代器(iterator),
容器和算法之间通过迭代器进行无缝连接。
STL 几乎所有的代码都采用了模板类或者模板函数
STL 提供了六大组件,彼此之间可以组合套用。
六大组件分别是:容器、算法、迭代器、仿函数、适配器(配接器)、空间配置器。
容器:
各种数据结构,如vector、list、deque、set、map 等,用来存放数据,
从实现角度来看,STL 容器是一种class template。
1:算法:
各种常用的算法,如sort、find、copy、for_each。
从实现的角度来看,STL 算法是一种function tempalte.
2:迭代器:
扮演了容器与算法之间的胶合剂,共有五种类型,
从实现角度来看,迭代器是一种将operator* ,operator-> , operator++,operator--等指针相关操作予以重载的class template.
所有STL 容器都附带有自己专属的迭代器,只有容器的设计者才知道如何遍历自己的元素。
原生指针(native pointer)也是一种迭代器。
3:仿函数:
行为类似函数,可作为算法的某种策略。
从实现角度来看,仿函数是一种重载了operator()的class 或者class template
4:适配器:
一种用来修饰容器或者仿函数或迭代器接口的东西。
5:空间配置器:
负责空间的配置与管理。
从实现角度看,配置器是一个实现了动态空间配置、空间管理、空间释放的class tempalte.
STL 六大组件的交互关系:
容器通过空间配置器取得数据存储空间,
算法通过迭代器存储容器中的内容,
仿函数可以协助算法完成不同的策略的变化,
适配器可以修饰仿函数。
STL 的一个重要特性是将数据和操作分离。
数据由容器类别加以管理,操作则由可定制的算法定义。
迭代器在两者之间充当“粘合剂”,以使算法可以和容器交互运作。
STL 具有高可重用性,高性能,高移植性,跨平台的优点。
高可重用性:STL 中几乎所有的代码都采用了模板类和模版函数的方式实现
高性能:如map 可以高效地从十万条记录里面查找出指定的记录,因为map 是采用红黑树的变体实现的。
高移植性:如在项目A 上用STL 编写的模块,可以直接移植到项目B上。
二、容器
常用的数据结构:
数组(array),
链表(list),
tree(树),
栈(stack),
队列(queue),
集合(set),
映射表(map),
根据数据在容器中的排列特性,这些数据分为序列式容器和关联式容器两种。
序列式容器强调值的排序,序列式容器中的每个元素均有固定的位置,
除非用删除或插入的操作改变这个位置。
Vector 容器、Deque 容器、List 容器等。
关联式容器是非线性的树结构,更准确的说是二叉树结构。
各元素之间没有严格的物理上的顺序关系,
也就是说元素在容器中并没有保存元素置入容器时的逻辑顺序。
关联式容器另一个显著特点是:在值中选择一个值作为关键字key,
这个关键字对值起到索引的作用,方便查找。
Set/multiset 容器Map/multimap 容器
迭代器
迭代器(iterator)是一种抽象的设计概念:
提供一种方法,使之能够依序寻访某个容器所含的各个元素,而又无需暴露该容器的内部表示方式。
------------------------------------------------常用容器------------------------------------------------
1:string 容器
string 封装了char,管理这个字符串,是一个char 型的容器。
String 封装了查找find,拷贝copy,删除delete 替换replace,插入insert等实用的成员方法,
user不用考虑内存释放和越界。
string 管理char*所分配的内存。
每一次string 的复制,取值都由string 类负责维护,不用担心复制越界和取值越界等。
string 构造函数 string();//创建一个空的字符串例如: string str; string(const string& str);//使用一个string 对象初始化另一个string 对象 string(const char* s);//使用字符串s 初始化 string(int n, char c);//使用n 个字符c 初始化v |
string 基本赋值操作 string& operator=(const char* s);//char*类型字符串赋值给当前的字符串 string& operator=(const string &s);//把字符串s 赋给当前的字符串 string& operator=(char c);//字符赋值给当前的字符串 string& assign(const char *s);//把字符串s 赋给当前的字符串 string& assign(const char *s, int n);//把字符串s 的前n 个字符赋给当前的字符串 string& assign(const string &s);//把字符串s 赋给当前字符串 string& assign(int n, char c);//用n 个字符c 赋给当前字符串 string& assign(const string &s, int start, int n);//将s 从start 开始n 个字符赋值给字符串 |