STL
- STL主要提供容器,适配器,迭代器,算法。
一些概念
- 适配器(adapter):将一个现成的抽象数据类型放在一个黑盒子中,而在盒内对抽象数据类型的接口进行合理的布局和改进,从而形成新的抽象数据类型接口。改装得到的新抽象数据类型就是适配器。
- 用户程序使用系统程序叫做调用
- 系统程序使用用户程序叫做回调
- 递归:递归程序设计是构造算法框架,而数学归纳法是证明框架的正确性。
泛型(generic type)
- 实现泛型编程主要依靠模板。
//函数模板
template<typename T1, ···,typename Tn> function(){
//code
}
//类模板
template<typename T1, ···,typename Tn> class C{
//code
};
C++11对泛型设计的改进
auto关键字:具有类型自动推导的能力,主要用于不能确定类型的变量(如函数返回值)。
decltype表达式:用于对函数返回值的类型推导进行指导。
auto multi(T a,U b) -> decltype(a*b){
//code
}
算法中的参数
- 算法中主要是三种参数:
- 迭代器参数: 裸指针,五种迭代器
- 辅助参数
- 谓词参数:实质上是回调函数,主要有函数指针,函数对象,lambda表达式
模板参数
- 类型参数
- 非类型参数: int,枚举,指针,引用。是常量,不可改变
- 模板定义型参数: 强调这个参数的实参必须是类模板,还强调了这个类模板所具有的参数个数。
//类型参数T,非类型参数a。
template<typename T,int a> function(){
//code
}
int x;
function<int,10>(x); //实例化
lambda 表达式
- lambda表达式,又叫无名(匿名)仿函数。主要是为了编写一次性代码。
- 可以在[]中填写lambda表达式拥有的数据成员。
- mutable:值传递捕获变量可修改说明符。
//无返回值
[](int x){
cout<<2*x<<endl;
}(12);
//有返回值的
int a = [](int x) -> int{
return 2*x;
}(10);
//先定义对象再调用
auto f = [](int x){
cout<<2*x;
};
f(10);