[TOC]
# 简介
STL 从广义上分为: 容器(container) 算法(algorithm) 迭代器(iterator),容器和算法之间通过迭代器进行无缝连接。STL 几乎所有的代码都采用了模板类或者模板函数,这相比传统的由函数和类组成的库来说提供了更好的代码重用机会
# 六大组件
STL提供了六大组件,彼此之间可以组合套用,这六大组件分别是:容器、算法、迭代器、仿函数、适配器、空间配置器。
* **容器**: 各种数据结构,如vector、list、deque、set、map等,用来存放数据,从实现角度来看,STL容器是一种class template。
* **算法**: 各种常用的算法,如sort、find、copy、`for_each`。从实现的角度来看,STL算法是一种function tempalte.
* **迭代器**: 扮演了容器与算法之间的胶合剂,共有五种类型,从实现角度来看,迭代器是一种将`operator* , operator-> , operator++,operator--`等指针相关操作予以重载的class template. 所有STL容器都附带有自己专属的迭代器,只有容器的设计者才知道如何遍历自己的元素。原生指针(native pointer)也是一种迭代器。
* **仿函数**: 行为类似函数,可作为算法的某种策略。从实现角度来看,仿函数是一种重载了operator()的class 或者class template
* **适配器**: 一种用来修饰容器或者仿函数或迭代器接口的东西。
* **空间配置器**: 负责空间的配置与管理。从实现角度看,配置器是一个实现了动态空间配置、空间管理、空间释放的class tempalte.
STL六大组件的交互关系,容器通过空间配置器取得数据存储空间,算法通过迭代器存储容器中的内容,仿函数可以协助算法完成不同的策略的变化,适配器可以修饰仿函数。
## 迭代器
迭代器的种类:

# 原理
~~~
//数组容器
template<class T>
class MyArray
{
public:
//保护原生指针,给原生指针取别名
typedef T* iterator;
MyArray()
{
mCapacity = 10;
mSize = 10;
p = new T[mCapacity];
for (int i = 0; i < mCapacity; i++)
{
p[i] = i + 1;
}
}
//提供迭代器,开始位置的迭代器
T* begin()
{
return p;
}
//返回结束位置的迭代器
T* end()
{
return p + mSize;
}
public:
T* p;
int mCapacity;
int mSize;
};
//算法
template<class T>
void printArray(T begin,T end)
{
for (; begin != end; ++begin)
{
cout << *begin << " ";
}
}
void test01()
{
MyArray<int> arr;
//获取容器提供的开始位置迭代器
MyArray<int>::iterator begin=arr.begin();
//获取容器提供的结束位置迭代器
MyArray<int>::iterator end = arr.end();
printArray(begin, end);
}
~~~
# 简单的helloworld
~~~
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<vector>//容器
#include<algorithm>//算法的头文件
#include<string>
using namespace std;
//加入算法的回调函数
void MyPrint(int val)
{
cout << val << " ";
}
//1.存储基础数据类型
void test01()
{
//容器
vector<int> v;
v.push_back(10);
v.push_back(20);
v.push_back(30);
v.push_back(40);
v.push_back(50);
//获取开始位置的迭代器
vector<int>::iterator begin = v.begin();
//获取结束位置的迭代器
vector<int>::iterator end = v.end();
/*
void _For_each(_InIt _First, _InIt _Last, _Fn1& _Func)
{
for (; _First != _Last; ++_First)
_Func(*_First);
}
*/
//遍历算法
for_each(begin, end, MyPrint);
cout << endl;
}
//2.容器存储对象
class Maker
{
public:
Maker(string name, int age)
{
this->name = name;
this->age = age;
}
public:
string name;
int age;
};
ostream &operator<<(ostream &out, Maker &m)
{
out << "Name:" << m.name << " Age:" << m.age << endl;
return out;
}
void test02()
{
vector<Maker> v;
//往容器中存储对象
v.push_back(Maker("悟空", 18));
v.push_back(Maker("小林", 19));
v.push_back(Maker("贝吉塔", 25));
v.push_back(Maker("龟仙人", 200));
v.push_back(Maker("短笛", 180));
//获取开始和结束位置的迭代器
vector<Maker>::iterator begin = v.begin();
vector<Maker>::iterator end = v.end();
while (begin!=end)
{
cout << (*begin);
begin++;
}
}
//3.存储对象的指针
void test03()
{
vector<Maker*> v;
//创建数据
Maker *m1 = new Maker("悟空", 18);
Maker *m2 = new Maker("小林", 19);
Maker *m3 = new Maker("贝吉塔",200 );
Maker *m4 = new Maker("龟仙人",180 );
Maker *m5 = new Maker("短笛", 18);
v.push_back(m1);
v.push_back(m2);
v.push_back(m3);
v.push_back(m4);
v.push_back(m5);
vector<Maker*>::iterator begin = v.begin();
vector<Maker*>::iterator end = v.end();
while (begin!=end)
{
cout << (*begin)->name << " " << (*begin)->age << endl;
++begin;
}
delete m1;
delete m2;
delete m3;
delete m4;
delete m5;
}
//4.容器嵌套容器
void test04()
{
vector<vector<int>> vs;
vector<int> v1;
vector<int> v2;
vector<int> v3;
vector<int> v4;
vector<int> v5;
for (int i = 0; i < 5; i++)
{
v1.push_back(i + 10);
v2.push_back(i + 10);
v3.push_back(i + 10);
v4.push_back(i + 10);
v5.push_back(i + 10);
}
vs.push_back(v1);
vs.push_back(v2);
vs.push_back(v3);
vs.push_back(v4);
vs.push_back(v5);
vector<vector<int>>::iterator begin = vs.begin();
vector<vector<int>>::iterator end = vs.end();
while (begin!=end)
{
vector<int>::iterator sbegin = (*begin).begin();
vector<int>::iterator send = (*begin).end();
while (sbegin!=send)
{
cout << *sbegin << " ";
++sbegin;
}
cout << endl;
++begin;
}
}
int main()
{
test04();
system("pause");
return EXIT_SUCCESS;
}
~~~
- c语言
- 基础知识
- 变量和常量
- 宏定义和预处理
- 随机数
- register变量
- errno全局变量
- 静态变量
- 类型
- 数组
- 类型转换
- vs中c4996错误
- 数据类型和长度
- 二进制数,八进制数和十六进制数
- 位域
- typedef定义类型
- 函数和编译
- 函数调用惯例
- 函数进栈和出栈
- 函数
- 编译
- sizeof
- main函数接收参数
- 宏函数
- 目标文件和可执行文件有什么
- 强符号和弱符号
- 什么是链接
- 符号
- 强引用和弱引用
- 字符串处理函数
- sscanf
- 查找子字符串
- 字符串指针
- qt
- MFC
- 指针
- 简介
- 指针详解
- 案例
- 指针数组
- 偏移量
- 间接赋值
- 易错点
- 二级指针
- 结构体指针
- 字节对齐
- 函数指针
- 指针例子
- main接收用户输入
- 内存布局
- 内存分区
- 空间开辟和释放
- 堆空间操作字符串
- 内存处理函数
- 内存分页
- 内存模型
- 栈
- 栈溢出攻击
- 内存泄露
- 大小端存储法
- 寄存器
- 结构体
- 共用体
- 枚举
- 文件操作
- 文件到底是什么
- 文件打开和关闭
- 文件的顺序读写
- 文件的随机读写
- 文件复制
- FILE和缓冲区
- 文件大小
- 插入,删除,更改文件内容
- typeid
- 内部链接和外部链接
- 动态库
- 调试器
- 调试的概念
- vs调试
- 多文件编程
- extern关键字
- 头文件规范
- 标准库以及标准头文件
- 头文件只包含一次
- static
- 多线程
- 简介
- 创建线程threads.h
- 创建线程pthread
- gdb
- 简介
- mac使用gdb
- setjump和longjump
- 零拷贝
- gc
- 调试器原理
- c++
- c++简介
- c++对c的扩展
- ::作用域运算符
- 名字控制
- cpp对c的增强
- const
- 变量定义数组
- 尽量以const替换#define
- 引用
- 内联函数
- 函数默认参数
- 函数占位参数
- 函数重载
- extern "C"
- 类和对象
- 类封装
- 构造和析构
- 深浅拷贝
- explicit关键字
- 动态对象创建
- 静态成员
- 对象模型
- this
- 友元
- 单例
- 继承
- 多态
- 运算符重载
- 赋值重载
- 指针运算符(*,->)重载
- 前置和后置++
- 左移<<运算符重载
- 函数调用符重载
- 总结
- bool重载
- 模板
- 简介
- 普通函数和模板函数调用
- 模板的局限性
- 类模板
- 复数的模板类
- 类模板作为参数
- 类模板继承
- 类模板类内和类外实现
- 类模板和友元函数
- 类模板实现数组
- 类型转换
- 异常
- 异常基本语法
- 异常的接口声明
- 异常的栈解旋
- 异常的多态
- 标准异常库
- 自定义异常
- io
- 流的概念和类库结构
- 标准io流
- 标准输入流
- 标准输出流
- 文件读写
- STL
- 简介
- string容器
- vector容器
- deque容器
- stack容器
- queue容器
- list容器
- set/multiset容器
- map/multimap容器
- pair对组
- 深浅拷贝问题
- 使用时机
- 常用算法
- 函数对象
- 谓词
- 内建函数对象
- 函数对象适配器
- 空间适配器
- 常用遍历算法
- 查找算法
- 排序算法
- 拷贝和替换算法
- 算术生成算法
- 集合算法
- gcc
- GDB
- makefile
- visualstudio
- VisualAssistX
- 各种插件
- utf8编码
- 制作安装项目
- 编译模式
- 内存对齐
- 快捷键
- 自动补全
- 查看c++类内存布局
- FFmpeg
- ffmpeg架构
- 命令的基本格式
- 分解与复用
- 处理原始数据
- 录屏和音
- 滤镜
- 水印
- 音视频的拼接与裁剪
- 视频图片转换
- 直播
- ffplay
- 常见问题
- 多媒体文件处理
- ffmpeg代码结构
- 日志系统
- 处理流数据
- linux
- 系统调用
- 常用IO函数
- 文件操作函数
- 文件描述符复制
- 目录相关操作
- 时间相关函数
- 进程
- valgrind
- 进程通信
- 信号
- 信号产生函数
- 信号集
- 信号捕捉
- SIGCHLD信号
- 不可重入函数和可重入函数
- 进程组
- 会话
- 守护进程
- 线程
- 线程属性
- 互斥锁
- 读写锁
- 条件变量
- 信号量
- 网络
- 分层模型
- 协议格式
- TCP协议
- socket
- socket概念
- 网络字节序
- ip地址转换函数
- sockaddr数据结构
- 网络套接字函数
- socket模型创建流程图
- socket函数
- bind函数
- listen函数
- accept函数
- connect函数
- C/S模型-TCP
- 出错处理封装函数
- 多进程并发服务器
- 多线程并发服务器
- 多路I/O复用服务器
- select
- poll
- epoll
- epoll事件
- epoll例子
- epoll反应堆思想
- udp
- socket IPC(本地套接字domain)
- 其他常用函数
- libevent
- libevent简介