• C++算法包学习


    C++的函数适配器

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

    #include 
    #include  
    #include 
    
    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()需要两个参数进行比较,直接按下面这样写不行
    	//find_if(setVar.begin(), setVar.end(), equal_to()); 
    	
    	set<string, less<string>::iterator> it = 
    	//需要比较的内容没有,使用函数适配器
    	//find_if(setVar.begin(), setVar.end(), equal_to(""), "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;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36

    C++算法包学习

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

    for_each

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

    #include 
    #include  
    #include 
    
    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;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    transform

    #include 
    #include  
    #include 
    
    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;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42

    find和find_if

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

    #include 
    #include  
    #include 
    
    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;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37

    count和count_if

    #include 
    #include  
    #include 
    
    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;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

    merge

    #include 
    #include  
    #include 
    
    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;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33

    sort

    #include 
    #include  
    #include 
    
    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() ,发现里面使用的是函数模板(泛型)
    	//这个实际上在我们定义的时候传入的类型是什么就决定是什么了
    	//如果你想跟系统一样匹配所有类型,那么定义成模板函数
    	 sort(vectorVar.ebgin(),vectorVar.end(),less<int>());
    	 forauto it = vectorResult.begin(); it != vectorResult.end(); it++{
    		cout << *it << endl;
    	}
    	return 0;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    random_shuffle

    #include 
    #include  
    #include 
    
    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;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    copy

    #include 
    #include  
    #include 
    
    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;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    replace

    #include 
    #include  
    #include 
    
    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;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
  • 相关阅读:
    猫眼逆向协议抢票开发
    云原生Kubernetes:K8S配置资源管理
    Swingbench 压力测试(超详细)
    html和css中的图片加载与渲染规则是什么样的?
    根据面积均分球面 & c++示意代码
    揭开堆叠式自动编码器的强大功能
    端对端 自动化单元测试
    LeetCode994.腐烂的橘子
    element plus封装el-select添加后缀图标并添加远程搜索和对话框功能
    3D-SKIPDENSESEG医学图像分割
  • 原文地址:https://blog.csdn.net/qq_34606099/article/details/126322169