版权声明:每天要问下自己:“昨天的自己与今天的自己有啥区别?” https://blog.csdn.net/u010921682/article/details/82984108
这一章最有同感的一句话是:
大量程序员被迫从事大量重复的工作,竟是为了完成前人早已完成而自己手上并未拥有的程序代码。这不仅是人力资源上的浪费,也是挫折与错误的来源。
第1章 STL 概论与 版本简介
1.1 STL概论 目的是为了复用
复用必须建立在某种标准之上
STL的诞生:
为了建立数据结构和算法的一套标准,并且降低其间的耦合关系以提升各自的独立性、弹性、交互操作性
STL 是一套程序库,一套抽象概念库,包括
- Assignable 可被赋值
- Default Constructible 不需任何参数可构造
- Equality Comparable 可判断是否等同
- LessThan Comparable 可比较大小
- Regular 正则
- …
高阶
- Input Iterator 具有输入功能的迭代器
- Output Iterator 具有输出功能的迭代器
- Forward Iterator 单向迭代器
- Bidirectional Iterator 双向迭代器
- Random Access Iterator 随机存取迭代器
- Unary Function 一元函数
- Binary Function 二元函数
- Predicate 传回真假值的一元判断式
- Binary Predicate 传回真假值的二元判断式
- …
更高阶
- sequence container 序列式容器
- associative container 关联式容器
STL所实现的,是依托泛型思维架设起来的一个概念结构。这个以抽象概念为主体而非以实际类为主体的结构,形成了一个严谨的接口标准。在此接口下,任何组件都有最大的独立性,并以所谓迭代器胶合起来,或以适配器互相配接,或以所谓仿函数动态选择某种策略
1.2 STL 六大组件 功能与运用
- 容器:各种数据结构,如vector, list, deque, set, map等
- 算法:各种常用算法,如sort, search, copy, erase等
- 迭代器:泛型指针,容器与算法之间的胶合剂
- 仿函数:行为类似函数,一种重载了operator( )的 class 或 class template
- 配接器:一种用来修饰容器或仿函数或迭代器接口的东西
- function adapter
- container adapter
- iterator adapter
- 配置器:负责空间配置和管理
1.3 GNU开源 Open Source
GNU is Not Unix
GPL 协议
1.4 - 1.8 略
1.9
1.9.1
- bound friend template friend
- template <>
1.9.2 临时对象 STL中最常用的技巧是应用于 仿函数
// 头文件略
// ...
class <typename T>
class print
{
public:
void operator()(const T& elem){
cout << elem << ' ';
}
}
int main()
{
int ia[6] = {0, 1, 2, 3, 4, 5};
vector<int> iv(ia, ia + 6);
for_each(iv.begin(), iv.end(), print<int>());// print<int>()是一个临时对象,不是一个函数调用
}
1.9.3 静态常量整数成员 略
1.9.4 迭代器的前++,后++,前–,后–,反解
注意的是:后++,后--,有int参数用以区分前++,前--
1.9.5 迭代器范围 前闭后开 [ )
实际范围:first, last - 1
迭代器last是“最后一个元素的下一个位置”
1.9.6 function call 操作符 operator( )
在C中,想要将函数当做参数传递,只有使用函数指针
operator() 重载 -> 仿函数
#include <iostream>
using namespace std;
template <class T>
struct plus{
T operator()(const T& x, const T& y) const{
return x + y;
}
}
int main(){
plus<int> plusobj;
cout << plusobj(3, 5) << endl; // 使用仿函数就像使用一般函数一样
cout << plus<int>()(43, 50) << endl; // 产生仿函数的临时对象
}