组件
三大组件:容器(container)、算法(algorithm)、迭代器(iterator)
或者说六大组件:
容器:存储数据
算法:操作数据
迭代器:容器和算法间的桥梁
仿函数:为算法提供更多策略
适配器:为算法提供更多参数接口(比如当初算法只需要一个参数,可以通过适配器多添加2、3、4…个参数)
空间配置器:管理容器和算法空间
算法
质变算法:对区间元素的增删、替换、拷贝
非质变算法:查找、遍历、计数、寻找极值
常用算法
https://blog.csdn.net/xiao_xiao_lan/article/details/115005016
函数对象
以下中的MyPrint()实质上是一个匿名对象,传入以后该对象实质赋予了print
谓词
第二点解释:比如类中定义一个成员num,每次调用时执行num++,而由该类实例化的函数对象里面会存放该成员变量,普通函数则没有,因此实质上是类中的成员帮函数对象记录了函数对象的状态
STL内建函数对象
举例 :
适配器
注意:需包含头文件 functional
步骤:
第一步:绑定:bind2nd或者bind1st绑定参数
第二步:公共继承binary_function(二元适配器)或者unary_function(一元适配器)
第三步:参数萃取
第四步:对oprator()进行const修饰
函数对象适配器
#include<vector>
#include <functional>
using namespace std;
class myPrint:public binary_function<int,int,void> {
public:
void operator()(int val,int tmp) const{
cout << val + tmp << endl;
}
};
void test0() {
vector<int> v;
v.push_back(10);
v.push_back(10);
v.push_back(10);
v.push_back(10);
//此处可理解为使用了bind2nd将多个参数转为一个参数,类似于python中的传递元组
for_each(v.begin(), v.end(), bind2nd(myPrint(), 1000));
}
bind2nd和bind1st的区别
bind2nd:将外界传来的数据放在第二个参数
bind1st:将外界传来的数据放在第一个参数
其他适配器
取反适配器(not1,not2)
一元取反方式(取反适配器也有二元取反,这里只展示一元取反)
成员函数适配器
解析来看,如果第三个参数直接传入:
showPerson :由于showPerson是Person类中的,此处直接调用无法找到该函数;
Person::showPerson :虽然指定了作用域,但是Person作为一个类而不是实例化了的对象,是不能直接访问到的,除非这个是个静态方法;
&Person::showPerson :加上引用才能真正拿到该函数的入口地址(或者说偏移量),但是for_each需要传参给此处,而showPerson()是没有接收参数的;
mem_fun_ref(&Person::showPerson) :将&Person::showPerson转换成成员函数适配器,即相当于对该函数入口地址(或者说偏移量)加上个修饰
函数指针适配器
注意:此处类是没有继承binary_function或者unary_function概念的(没有涉及到类),只需要将myPrintInt01转换成函数指针适配器就行了
迭代器
#include<vector>
void FuncMyPrint(int val);
void test0() {
//单端动态数组vector类模板
vector<int> v;//v是具体的vector容器
//push_back尾插法
v.push_back(100);
v.push_back(200);
//定义一个迭代器存储V的起始迭代器
vector<int>::iterator beginIt = v.begin();
//定义一个迭代器存储V的结束迭代器
vector<int>::iterator endIt = v.end();
//for循环遍历0
for (; beginIt != endIt; beginIt++) {
//对迭代器取*是指向当前容器中存储的元素
cout << *beginIt << " ";
}
cout << endl;
//STL提供的算法来遍历容器(需要包含头文件algorithm)
//for_each从begin到end逐个遍历,每取出一个元素调用一次FuncMyPrint
for_each(v.begin(), v.end(), FuncMyPrint);
cout << endl;
}
void FuncMyPrint(int val) {
cout << val << " ";
}
容器存储类对象
class Person {
private:
string name;
int age;
public:
Person(string name, int age) {
this->name = name;
this->age = age;
}
void MyPrintPerson() {
cout << name << " " << age << endl;
}
};
void FuncMyPrint(Person& ob);</