CPP_STL(标准模板库)

本文详细介绍了C++的STL(标准模板库),包括容器(如vector、deque、stack、queue、list、set、map等)、算法(包括常见算法和函数对象)以及适配器(如bind2nd、bind1st、函数对象适配器等)。此外,还讨论了迭代器的作用和仿函数的概念,并给出了lambda表达式的应用示例。
摘要由CSDN通过智能技术生成

组件

三大组件:容器(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);</
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值