C++算法包学习

C++的函数适配器

这是find_if 的源码,first和last是迭代器的开始和结束位置,pred是自定义仿函数。方面对照
在这里插入图片描述
equal_to的源码部分,方面对照
在这里插入图片描述

#include <iostream>
#include <set> 
#include <algorithm>

using namespace std;

int main(){
	set<string ,less<string>> setVar;
	setVar.insert("a");
	setVar.insert("b");
	setVar.insert("c");

	for(set<string>::iterator it = setVar.begin(); it != setVar.end();it++) {
		cout << *it << endl;
	}
	// find_if
	//equal_to 比较用的   equal_to<string>()需要两个参数进行比较,直接按下面这样写不行
	//find_if(setVar.begin(), setVar.end(), equal_to<string>()); 
	
	set<string, less<string>::iterator> it = 
	//需要比较的内容没有,使用函数适配器
	//find_if(setVar.begin(), setVar.end(), equal_to<string>(""), "c"); 怎么写都不行
	//可以对比上面的源码截图
	//bind2nd:能够把c传到equal_to的y值那里
	//之后把setVar.begin(), setVar.end()前面的开始到结束传到X值
	//bind1st() 第一个参数适配过去
	find_if(setVar.begin(), setVar.end(), bind2nd(equal_to<string>(),"c"));

	if(it != setVar.end()){
		cout < "找到了" << endl;
	}
	
	
	return 0;
}

C++算法包学习

这些函数都是能找到API文档的。

for_each

在这里插入图片描述
在这里插入图片描述

#include <iostream>
#include <set> 
#include <algorithm>

using namespace std;

class __F{
public:
	void operator()(int __first){
		cout << "自定义一元谓词" << __fist << endl;
	}
}

int main(){
	vetctor<int> vectorVar;
	vectorVar.insert(10);
	vectorVar.insert(20);
	vectorVar.insert(30);
	vectorVar.insert(40);
	vectorVar.insert(50);
	
	for_each(vectorVar.begin(), vectorVar.end(),__F());
	
	return 0;
}

transform

#include <iostream>
#include <set> 
#include <algorithm>

using namespace std;

class __unary_op{
public:
	// 能否接收int 返回string呢?是不行的,因为源码里面已经定义好了类型
	int operator()(const int __first){
		cout << "自定义一元谓词" << __fist << endl;
		return __first + 9; // 修改每个元素 + 9
	}
}

int main(){
	vetctor<int> vectorVar;
	vectorVar.insert(10);
	vectorVar.insert(20);
	vectorVar.insert(30);
	vectorVar.insert(40);
	vectorVar.insert(50);
	
	// 第一种 类似于rxjava map 变化操作符
	// 迭代器 result == 参数三
	transform(vectorVar.begin(),vectorVar.end(), vextorVar.begin(), __unary_op());
	for (auto it = vectorVar.begin(); it != vectorVar.end(); it++) {
	cout << "第一种方式:" << *it << endl; 
	}

	// 第二种方式,其实就是接收的迭代器参数是重新创建
	
	vector<int> vectorVarResult;
	 // 定义result 大小空间
	 vectorVarResult。resize(vectorVar.size());
	transform(vectorVar.begin(),vectorVar.end(), vectorVarResult.begin(), __unary_op());
	for (auto it = vectorVar.begin(); it != vectorVar.end(); it++) {
	cout << "第一种方式:" << *it << endl; 
	}
	return 0;
}

find和find_if

find:自己啥也没干,就是简单对find_if的封装
find_if:仿函数是自定义的,条件自己写。
在这里插入图片描述

#include <iostream>
#include <set> 
#include <algorithm>

using namespace std;

class __pred{
public:
	int number;
	__pred(int number):number(number) {}
	bool operator()(const int value){
	return number == value;
	}
}

int main(){
	vetctor<int> vectorVar;
	vectorVar.insert(10);
	vectorVar.insert(20);
	vectorVar.insert(30);
	vectorVar.insert(40);
	vectorVar.insert(50);
	
	//find_if 
/**
关键代码: while(__first != __last && !__pred(__first)) //自定义仿函数 返回值bool 传入int
	++ __first; //迭代器挪动
	return __first;
*/
	auto it = find(vectorVar.begin(), vectorVar.end(), __pred(10));
	//判断结果
	if(it != vectorVar.end()) {}

	 
	return 0;
}

count和count_if

#include <iostream>
#include <set> 
#include <algorithm>

using namespace std;

int main(){
	vetctor<int> vectorVar;
	vectorVar.push_back(1);
	vectorVar.push_back(3);
	vectorVar.push_back(2);
	vectorVar.push_back(2);
	vectorVar.push_back(4);
	
	count(vectorVar.begin(),vectorVar.end(),2);// 统计2的个数
	//count_if:仿函数是自定义的,条件自己写。
/**
跟上面的find和find_if类似
conut_if关键代码: 
	for(;__first != __last; ++first)
		if(__pred(__first)) //满足条件则下面进行计数加1,注意:__first是迭代器类型
		++__n;
		return __n;
*/
	 
	return 0;
}

merge

#include <iostream>
#include <set> 
#include <algorithm>

using namespace std;

int main(){
	vetctor<int> vectorVar;
	vectorVar.push_back(1);
	vectorVar.push_back(2);
	vectorVar.push_back(3);
	vectorVar.push_back(4);
	
	vetctor<int> vectorVar2;
	vectorVar2.push_back(5);
	vectorVar2.push_back(6);
	vectorVar2.push_back(7);
	vectorVar2.push_back(8);
	
	// 合并成一个result
	vector<int> vectorResult;
	vectorResult.resize(vectorVar.size() + vectorVar2.size());
	// 源码引用的函数太多,不太适合在这里贴出。
	merge(vectorVar.begin(),vectorVar.end(),vectorVar.begin(),
	vectorVar2.end(),vectorReault.begin())
	
	forauto it = vectorResult.begin(); it != vectorResult.end(); it++{
	cout << *it << endl;
	}
	 
	return 0;
}

sort

#include <iostream>
#include <set> 
#include <algorithm>

using namespace std;

int main(){
	vetctor<int> vectorVar;
	vectorVar.push_back(1);
	vectorVar.push_back(2);
	vectorVar.push_back(4);
	vectorVar.push_back(3);
	
	//源码查找最终找到关键代码: if (__comp(__i,__first))
	// 自定义仿函数规则 返回值 bool 第一个参数int 第二个参数类型?
	// 参考系统内置的仿函数 less<int>() ,发现里面使用的是函数模板(泛型)
	//这个实际上在我们定义的时候传入的类型是什么就决定是什么了
	//如果你想跟系统一样匹配所有类型,那么定义成模板函数
	 sort(vectorVar.ebgin(),vectorVar.end(),less<int>());
	 forauto it = vectorResult.begin(); it != vectorResult.end(); it++{
		cout << *it << endl;
	}
	return 0;
}

random_shuffle

#include <iostream>
#include <set> 
#include <algorithm>

using namespace std;

int main(){
	vetctor<int> vectorVar;
	vectorVar.push_back(1);
	vectorVar.push_back(2);
	vectorVar.push_back(3);
	vectorVar.push_back(4);
	
	// 随机打乱顺序
	 random_shuffle(vectorVar.ebgin(),vectorVar.end());
	 forauto it = vectorVar.begin(); it != vectorVar.end(); it++{
		cout << *it << endl;
	}
	return 0;
}

copy

#include <iostream>
#include <set> 
#include <algorithm>

using namespace std;

int main(){
	vetctor<int> vectorVar;
	vectorVar.push_back(1);
	vectorVar.push_back(2);
	vectorVar.push_back(3);
	vectorVar.push_back(4);
	
	vector<int> vectorResult;
	vectorResult.resize(vectorVar.size());
	// 复制 这个api还是有点常用的
	 copy(vectorVar.ebgin(),vectorVar.end(),vectorResult.begin());
	 forauto it = vectorResult.begin(); it != vectorResult.end(); it++{
		cout << *it << endl;
	}
	return 0;
}

replace

#include <iostream>
#include <set> 
#include <algorithm>

using namespace std;

int main(){
	vetctor<int> vectorVar;
	vectorVar.push_back(1);
	vectorVar.push_back(2);
	vectorVar.push_back(3);
	vectorVar.push_back(4);
	
	// 1~2 的范围内 把2替换成22
	 replace(vectorVar.ebgin(),vectorVar.begin()+ 2,2,22);
	 forauto it = vectorVar.begin(); it != vectorVar.end(); it++{
		cout << *it << endl;
	}
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值