STL是可复用的标准模板库,在泛性思维上架设的一个概念结构,使抽象概念为主体,并使其系统化。
容器(containers):用于存放数据,包含各种如vector,list,deque,set,map等数据结构。
分配器(allocators):存在于每个容器中,实现动态的空间配置、空间管理、空间释放。
算法(algorithms):操作数据的方法。
迭代器(iterators):迭代器就是算法和数据之间的桥梁,泛化的指针。
仿函数(functors):自定义类型的计算,算法的某种策略,内部是重载。
适配器(Adapter):用于转换,修饰接口,可以转换容器、仿函数、迭代器。比如stack和queue的底层就是借助deque完成的,属于容器适配器。
#include <vector> #include <algorithm> #include <functional> #include <iostream> using namespace std; int main() { int ia[6]={27,210,12,47,109,83}; vector<int,alloctor<int>>vi(ia,ia+6);//1 cout << count_if(vi.begin(),vi.end(),not1(bind2nd(less<int>(),40)));//2 return 0; }
解释:
1.定义vector,后面的<>进行传参。第一个参数是数据类型,第二个模板参数的分配器(一般忽略不写,源代码有默认值)分配器本身是一个模板,要传参alloctor<int>,要与前者匹配。
2.count_if()是一个算法,计算出条件之下符合条件的元素有几个。less<int>()是仿函数,判断a是否小于b。
bind2nd和not1是函数适配器,bind2nd可以绑定第二个参数,将a小于b转换为a小于40.not1则是反转结果,变为大于等于40。
在STL中,这些“一整组操作”都是通过仿函数的形式实现的。简单来说就是对操作符进行重载。比如左右括号。
template <class T> struct plus{//仿函数plus T operator()(const T& x,const T& y) const {return x + y} }; int main() { //产生仿函数对象 plus<T> plusobj; //使用仿函数 cout<<plusobj(2,3); //产生仿函数临时对象 cout<<plus<int>(2,3); }
标签:01,函数,适配器,概念,vector,分配器,include,模板 From: https://www.cnblogs.com/anzf/p/16837669.html