一.STL
初识
1.STL的诞生
- 长久以来,软件界一直希望建立一种可重复利用的东西
- C++的面向对象和泛型编程思想,目的就是复用性的提升
- 多情况下,数据结构和算法都未能有一套标准,导致被迫从事大量重复工作
- 为了建立数据结构和算法的一套标准,诞生了
STL
2.STL的基本概念
STL
(Standard Template Library,标准模板库)STL
从广义分为: 容器(container) 算法(algorithm) 迭代器(iterator)- 容器和算法之间通过迭代器进行无缝连接
STL
几平所有的代码都采用了模板类或者模板函数
3.STL六大组件
STL
大体分为六大组件,分别是:容器、算法、迭代器、仿函数、适配器(配接器)、空间配置器
- 1.容器: 各种数据结构,如
vector、list、deque、set、map
等,用来存放数据. - 2.算法: 各种常用的算法,如
sort、find、copy、for_each
等 - 3.迭代器: 扮演了容器与算法之间的胶合剂
- 4.仿函数: 行为类似函数,可作为算法的某种策略。
- 5.适配器:一种用来修饰容器或者仿函数或迭代器接口的东西。
- 6.空间配置器: 负责空间的配置与管理。
4. 容器、算法、迭代器
容器:置物之所也。
STL
容器就是将运用最广泛的一些数据结构实现出来,常用的数据结构:数组,链表,树,栈队列,集合,映射表等。这些容器分为序列式容器和关联式容器两种:
- 序列式容器:强调值的排序,序列式容器中的每个元素均有固定的位置,上面例子常见容器都是序列式容器
- 关联式容器:二叉树结构,各元素之间没有严格的物理上的顺序关系
算法:问题之解法也。
有限的步骤,解决逻辑或数学上的问题,这一门学科我们叫做算法(Algorithms)]
算法分为:质变算法和非质变算法。
- 质变算法: 是指运算过程中会更改区间内的元素的内容。例如拷贝,替换,删除等等;
- 非质变算法:是指运算过程中不会更改区间内的元素内容,例如查找、计数、遍历、寻找极值等等。
迭代器:容器和算法之间粘合剂。
提供一种方法,使之能够依序寻访某个容器所含的各个元素,而又无需暴露该容器的内部表示方式
每个容器都有自己专属的选代器
迭代器使用非常类似于指针,初学阶段我们可以先理解迭代器为指针
迭代器种类:
常用的容器中迭代器种类为双向迭代器,和随机访问选代器。
二.函数对象
1.函数对象理解
- 重载函数操作调用符
()
的类,其对象常称为函数对象。 - 函数对象使用重载的
()
时,行为类似函数调用,也叫仿函数
函数对象(仿函数)本质是一个类,而不是一个函数。
函数对象使用:
函数对象在使用时,可以像普通函数那样调用,可以有参数,可以有返回值
class Myadd { public: int operator()(int v1, int v2) { return v1 + v2; } }; void test01() { Myadd myadd; cout << myadd(10, 10) << endl; }
函数对象超出普通函数的概念,函数对象可以有自己的状态
class Myadd { public: Myadd() { this->count = 0; } int operator()(int v1, int v2) { return v1 + v2; } int count; };
函数对象可以作为参数传递
三.谓词
1.一元谓词
- 返回
bool
类型的仿函数称为谓词- 如果operator()接受一个参数,那么叫做一元谓词
- 如果operator()接受两个参数,那么叫做二元谓词
class greatfive
{
public:
bool operator()(int val)
{
return val>5;
}
};
2.二元谓词
class Myadd
{
public:
bool operator()(int v1, int v2)
{
return v1>v2;
}
};
四.内建函数对象
1.内建函数概念
STL
自己建立一些仿函数,叫它内建函数。
这些仿函数分类有:
- 算数仿函数
- 关系仿函数
- 逻辑仿函数
这些仿函数所产生的对象,用法和一般函数完全相同
使用内建函数对象,需要引入头文件#include <functional>
2.算术仿函数
功能:
- 实现四则运算
- 其中
negate
取反是一元运算,其他都是二元运算
仿函数原型:
template<class T> T plus<T> //加法仿函数
template<class T> T minus<T> //减法仿函数
template<class T> T multiplies<T> //乘法仿函数
template<class T> T divides<T> //除法仿函数
template<class T> T modulus<T> //取模仿函数
template<class T> T negate<T> //取反仿函数
使用一元仿函数:
negate<int> n;
cout<<n(50)<<endl;
使用二元仿函数
plus<int> n;
cout<<n(50,50)<<endl;
3.关系仿函数
实现关系对比:
template<class T> bool equal_to<T> //等于
template<class T> bool not_equal_to<T> //不等于
template<class T> bool greater<T> //大于
template<class T> bool greater_equal<T> //大于等于
template<class T> bool less<T> //小于
template<class T> bool less_equal<T> //小于等于
4.逻辑仿函数
template<class T> bool logical_and<T> //逻辑与
template<class T> bool logical_or<T> //逻辑或
template<class T> bool logical_not<T> //逻辑非