zoukankan      html  css  js  c++  java
  • STL之函数对象

    目录


    为了使类属算法具有灵活性,STL常使用函数的重载机制为算法提供两种形式。算法的第一种形式使用的是常规的操作来实现。第二种形式中,算法可以根据用户指定的准测对元素经行处理。

    函数对象包含了一个可以通过函数调用运算符()使用的函数。实际上,函数对象是重载了函数调用运算符operator()的类模板。

    用户可以创建自己的函数对象。STL提供了算术函数对象,关系函数对象,逻辑函数对象。


    算术函数对象:

    1. plus<type>                                 加
    2. minus<type>                              减
    3. multiplies<type>                       乘
    4. divides<type>                            除
    5. modulus<type>                        模
    6. negate<type>                            取反

    示例代码:

    #include <iostream>
    #include <algorithm>
    #include <string>
    #include <numeric>
    #include <iterator>
    #include <vector>
    #include <functional>
    
    using namespace std;
    
    int functAdd(plus<int>,int,int);
    
    int main() {
    	// 加法函数对象
    	plus<int> addNum;
    	int sum = addNum(34,56);
    	cout << "Sum=" << sum << endl;
    
    	// 字符串拼接
    	plus<string> joinString;
    	string s1 = "hello";
    	string s2 = "There";
    
    	string str = joinString(s1,s2);
    	cout << "str=" << str << endl;
    
    	// 调用外部函数
    	cout << "funcAdd=" << functAdd(addNum,34,26) << endl;
    
    	int list[8] = {1,2,3,4,5,6,7,8};
    	vector<int> intsList(list,list+8);
    	ostream_iterator<int> screenOut(cout, " ");
    
    	cout << "intList:";
    	copy(intsList.begin(),intsList.end(),screenOut);
    	cout << endl;
    
    	//累计
    	int suma = accumulate(intsList.begin(),intsList.end(),0);
    	cout << "accumulate:" << suma << endl;
    
    	int product = accumulate(intsList.begin(),intsList.end(),1,multiplies<int>());
    
    	cout << "product:" << product << endl;
    
    	return 0;
    }
    
    int functAdd(plus<int> sum,int x,int y) {
    	return sum(x, y);
    }
    

    运行结果:

    intQueue.front:26
    intQueue.back:33
    intQueue.front:18
    intQueue :
    18 50 33


    关系函数对象:

    1. equal_to<type>                                      等于
    2. not_equal_to<type>                              不等于
    3. greater<type>                                         大于
    4. greater_equal<type>                             大于等于
    5. less<type>                                              小于
    6. less_equal<type>                                 小于等于

    示例代码:

    #include <iostream>
    #include <algorithm>
    #include <string>
    #include <numeric>
    #include <iterator>
    #include <vector>
    #include <functional>
    
    using namespace std;
    
    int main() {
    	// 等于
    	equal_to<int> compare;
    	bool isEqual = compare(6,6);
    	cout << "isEqual=" << isEqual << endl;
    
    	// 大于
    	greater<string> greaterString;
    	string s1 = "hello";
    	string s2 = "there";
    
    	if (greaterString(s1, s2))
    	{
    		cout << s1 << " is greater than " << s2 << endl;
    	} else {
    		cout << s2 << " is greater than " << s1 << endl;
    	}
    
    	int temp[8] = {2,3,4,5,1,7,8,9};
    	vector<int> vecList(temp,temp+8);
    	vector<int>::iterator intItr1,intItr2;
    	ostream_iterator<int> screen(cout, " ");
    	cout << "vecList:" <<endl;
    	copy(vecList.begin(),vecList.end(),screen);
    	cout << endl;
    
    	intItr1 = adjacent_find(vecList.begin(),vecList.end(),greater<int>());
    	intItr2 = intItr1 + 1;
    
    	cout << "intItr1:" << *intItr1 <<",intItr2:" << *intItr2 << endl;
    	cout << "psition:" << vecList.end() - intItr2 << endl;
    	cout << "psition:" << intItr2 - vecList.begin() << endl;
    
    	return 0;
    }
    

    运行结果:

    isEqual=1
    there is greater than hello
    vecList:
    2 3 4 5 1 7 8 9
    intItr1:5,intItr2:1
    psition:4
    psition:4


    逻辑运算对象:

    1. logical_not<type>
    2. logical_and<type>
    3. logical_or<type>



  • 相关阅读:
    常用作图与图片处理工具
    在博客园中配置MathJax
    Make Eudict for reviewing example sentences
    使用AltSearch格式化Kindle读书笔记
    Deep Learning基础--理解LSTM/RNN中的Attention机制
    Deep Learning基础--理解LSTM网络
    Deep Learning基础--SVD奇异值分解
    常见面试之机器学习算法思想简单梳理
    Deep Learning基础--CNN的反向求导及练习
    Deep Learning基础--线性解码器、卷积、池化
  • 原文地址:https://www.cnblogs.com/wjchang/p/3671501.html
Copyright © 2011-2022 走看看