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; }
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){}//构造函数接收一个边界值,有默认实参0 bool 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; }
//利用标准库算法和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){}//构造函数接收一个边界值,有默认实参0 bool 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"; }
//用对象替代GT6 //要求读不太懂,测试给定string对象的长度是否与其边界相匹配(好像是废话,就找1到10之间的就行了) //报告输入中有多少单词的长度在1和10之间 //按原程序算,这是统计是删除了重复的以后了 #include"head.h" using namespace std; class GT_cls{ public: GT_cls(size_t val = 0): bound(val){}//构造函数接收一个边界值,有默认实参0 bool 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; }