调用操作符和函数对象

来源:互联网 发布:mac os怎样卸载软件 编辑:程序博客网 时间:2024/06/16 01:03

p451-p467

今天不看完第三部分不睡觉~!!!!!!!!!!!!!!!!!!日,明天还要爬山。。

简单说来,就是可以把对象当成函数看

//函数对象,#include"head.h"struct absInt{int operator() (int val){//求绝对值return val < 0 ? -val : val;}};int main(){int i = -33;absInt absObj;unsigned int ui = absObj(i);std::cout << ui << std::endl;}


pe14_31



//完成如果-则-否则。#include"head.h"struct func{int operator() (bool b, int val1, int val2){//求绝对值return b ? val1 : val2;}};int main(){int a = 33,b = 44;func func1;bool open;//状态标记open = 1;unsigned int ui = func1(open, a, b);std::cout << ui << std::endl;open = 0;ui = func1(open, a, b);std::cout << ui << std::endl;}

习题14.32

Q:一个重载的函数调用操作符可以接受多少个操作数?

A:无数?!貌似是。。。。这问题目的何在(mark

int operator() (bool b, int val1, int val2,...);//声明unsigned int ui = func1(open, a, b,a,a,a,a,a,a,a,a,a,a);//调用


=================================================================================================================================

接下来该讨论以前遗留的比较有印象的GT6(greater than 6)函数的缺陷了:代码(函数)重用性(我也不知到合适词汇)太低,6是写进去的,要改变只能改代码

bool GT6(const string &s){return s.size() >= 6;}

review:泛型算法,iterator,inserter,各种capacity对算法的支持与不支持,capacity的特征,顺序,可以随机读取之类的,前插入后插入。。。

另外,string也有几个函数是跳过来的,什么append,merge之类的

vector<string>::size_tyoe wc = count_if(words.begin(), words.end(), GT6);//标准库算法提供的计数算法,第三个是条件判断,返回bool类型,GT6有个title,叫谓词函数


//用GT_cls弥补GT6的缺陷#include"head.h"class GT_cls{public:GT_cls(size_t val = 0): bound(val){}//构造函数接收一个边界值,有默认实参0bool operator()(const std::string &s){//对输入的string对象进行判断return s.size() >= bound;}private:std::string::size_type bound;};int main(){GT_cls gt_3(3);GT_cls gt_4(4);GT_cls gt_5(5);std::string str1("he");std::string str2("hell");std::string str3("world");std::vector<std::string> words;words.push_back(str1);words.push_back(str2);words.push_back(str3);new GT_cls(2);GT_cls(3);//这块的理解有困难,传入的是一个初始化对象的过程,怎么用取决于count_if()的实现,//我传入的应该是一个刚刚初始化的对象,他调用的确实对象函数加string形参//那就是说传入的是个函数,怎么填参数不关心,(通过指针之类的保存这个函数位置)//不管传入的式子怎样,count_if()就记住这个形式了,认为他是个函数,每次调用GT_cls( str.);std::cout << std::count_if(words.begin(), words.end(), GT_cls(3))<< " words 3 characters or longer" << std::endl;std::cout << std::count_if(words.begin(), words.end(), GT_cls(4))<< " words 4 characters or longer" << std::endl;std::cout << std::count_if(words.begin(), words.end(), GT_cls(5))<< " words 5 characters or longer" << std::endl;//更有用的是,输入变量,完成批量任务for(size_t i = 1; i != 11; ++i)std::cout << count_if(words.begin(), words.end(), GT_cls(i))<< " words " << i << " characters or longer" << std::endl;//还可以计算大于3小于6的std::cout <<count_if(words.begin(), words.end(), GT_cls(3)) - count_if(words.begin(), words.end(), GT_cls(6)) << std::endl;}

pe14_33
//利用标准库算法和GT_cls类,查找第一个比指定值大的元素std::cout << *(find_if(words.begin(), words.end(), GT_cls(2))) << std::endl;std::cout << *(find_if(words.begin(), words.end(), GT_cls(4))) << std::endl;std::cout << *(find_if(words.begin(), words.end(), GT_cls(5))) << std::endl;}


pe14_34


//判断是否相等,利用标准库算法,替换指定值,就是如果finde_if(),替换掉#include"head.h"class word_equal{public:word_equal(const std::string str = ""): word(str){}//构造函数接收一个边界值,有默认实参0bool operator()(const std::string &s){//对输入的string对象进行判断return s == word;}private:std::string word;};int main(){std::string str1("he");std::string str2("hell");std::string str3("world");std::vector<std::string> words;words.push_back(str1);words.push_back(str2);words.push_back(str3);words.push_back(str1);for(std::vector<std::string>::iterator iter = words.begin(); iter != words.end(); iter++)std::cout << *iter << "\t";//进行替换std::string search("he");while(std::count_if(words.begin(), words.end(), word_equal(search))){//利用count_if()非零来判断是否存在相应对象 *(std::find_if(words.begin(), words.end(), word_equal(search))) = "HOLY GOD~!";//利用find_if()逐个更改}std::cout << std::endl << "After change: " << std::endl;for(std::vector<std::string>::iterator iter = words.begin(); iter != words.end(); iter++)std::cout << *iter << "\t";}

pe14_35


//用对象替代GT6//要求读不太懂,测试给定string对象的长度是否与其边界相匹配(好像是废话,就找1到10之间的就行了)//报告输入中有多少单词的长度在1和10之间//按原程序算,这是统计是删除了重复的以后了#include"head.h"using namespace std;class GT_cls{public:GT_cls(size_t val = 0): bound(val){}//构造函数接收一个边界值,有默认实参0bool operator()(const std::string &s){//对输入的string对象进行判断return s.size() >= bound;}private:std::string::size_type bound;};bool isShorter(const string &s1, const string &s2){return s1.size() < s2.size();}static string make_plural(vector<string>::size_type sz, string word, string append){return (sz <= 1) ? word : word + append;}int main(){vector<string> words;string next_word;while(cin >> next_word){words.push_back(next_word);}sort(words.begin(), words.end());//排序vector<string>::iterator end_unique = unique(words.begin(), words.end());//unique负责排序,并返回相应迭代器words.erase(end_unique, words.end());//删除最后几个重复的stable_sort(words.begin(), words.end(), isShorter);//自定义函数的介入vector<string>::size_type wc = count_if(words.begin(), words.end(), GT_cls(10));cout << wc << " " << make_plural(wc, "word", "s") << " 10 characters or longer" << endl;//本题要的结果std::cout << count_if(words.begin(), words.end(), GT_cls(1)) - count_if(words.begin(), words.end(), GT_cls(10)) << " words GT1 but not GT10 " << std::endl;return 0;}

14.36,太简单,输出长度1到9之间以及10以上的单词的数目

原创粉丝点击