STL源码剖析第1章STL概论与版本简介 笔记

版权声明:每天要问下自己:“昨天的自己与今天的自己有啥区别?” 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 六大组件 功能与运用

  1. 容器:各种数据结构,如vector, list, deque, set, map等
  2. 算法:各种常用算法,如sort, search, copy, erase等
  3. 迭代器:泛型指针,容器与算法之间的胶合剂
  4. 仿函数:行为类似函数,一种重载了operator( )的 class 或 class template
  5. 配接器:一种用来修饰容器或仿函数或迭代器接口的东西
    • function adapter
    • container adapter
    • iterator adapter
  6. 配置器:负责空间配置和管理

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; // 产生仿函数的临时对象
}

猜你喜欢

转载自blog.csdn.net/u010921682/article/details/82984108