重新学习《C++Primer5》第10章-泛型算法
2016-05-16 10:40
411 查看
10.3 lamdba捕获
1.值捕获int sz = 5; cout<<count_if(words.begin(), words.end(), [sz](const string &s){return s.size() >= sz; })<<endl;
2.引用捕获
3.可变lamdba
auto fun = [sz]()mutable->bool{while (sz == 0)--sz; return true; };
4.推断返回类型
10.4参数绑定
1.当需要传递多个参数时,bool check_size(const string& s, string::size_type sz) { return s.size() >= sz; } auto wc = find_if(words.begin(), words.end(), bind(check_size, _1, sz));
2.bing的参数顺序
auto g=bind(f,a,b,_2,c,_1); g(_1,_2);//实际上是 sort(words.begin(), words.end(), bind(isShorter, _2, _1)); sort(words.begin(), words.end(), isShorter); //两个参数调用顺序相反
2.bind绑定引用参数ref
for_each(words.begin(),words.end(),bind(print,os,_1,' ');//错误,不能拷贝os for_each(words.begin(),words.end(),bind(print, ref(os),_1,' ');//正确
auto it=partition(words.begin(),words.end(),bind(lengthMorethan,_1,sz));
10.5 再谈迭代器
1.插入迭代器back_inserter:创建一个使用push_back的迭代器
front_inserter:创建一个使用front_back的迭代器
inserter:创建一个使用inserter的迭代器
vector<int> vinsert = { 1, 2, 3, 4, 5, 6, 7, 8, 9 }; list<int> l1, l2, l3; unique_copy(vinsert.begin(), vinsert.end(), back_inserter(l1)); unique_copy(vinsert.begin(), vinsert.end(), front_inserter(l2)); unique_copy(vinsert.begin(), vinsert.end(), inserter(l3, l3.begin())); for_each(l1.begin(), l1.end(), [](const int &t){cout << t << ","; }); cout << endl; //123456789 for_each(l2.begin(), l2.end(), [](const int &t){cout << t << ","; }); cout << endl; //987654321 for_each(l3.begin(), l3.end(), [](const int &t){cout << t << ","; }); cout << endl; //123456789
2.iostream迭代器
istream_iterator
//标准输入读取数据 istream_iterator<string> in_iter(cin); istream_iterator<string> eof; vector<string> words; while (in_iter != eof) words.push_back(*in_iter++); for (auto word : words) cout << word << ",";
ostream_iterator
ostream_iterator<int> out_iter(cout, " "); for (auto e : vec2) *out_iter++ = e;
//习题1 void readstreamit(ifstream &in) { if (!in) { cout << "打开输入文件失败!" << endl; exit(1); } istream_iterator<string> in_iter(in); istream_iterator<string> eof; vector<string> words; while (in_iter != eof) words.push_back(*in_iter++); for (auto word : words) cout << word << ","; }
void fun() { istream_iterator<int> in_iter(cin),eof; vector<int> vec; while (in_iter != eof) { vec.push_back(*in_iter++); } ostream_iterator<int> out_iter(cout); for (auto e : vec) *out_iter++ = e; unique_copy(vec.begin(), vec.end(), out_iter); }
3.反向迭代器
从后往前反向移动的迭代器,除了forward_list其它容器都支持
for(auto r_it=vec.crbegin();r_it!=vec.crend();++r_it) cout<<*r_it;//倒序输出元素
反向迭代器翻转应用(base成员)
//打印一句话当中的最后一个单词,先找到最后一个逗号,然后输出逗号之后的位置 auto comma=find(words.crbegin(),words.crend(),','); cout<<string(comma,words.crbegin());//这个结果不是我们想要的,加入words为:first,second,third.这会输出driht; //需要利用base成员反转 cout<<string(comma.base(),words.cend());
Note:当我们从一个普通迭代器初始化一个反向迭代器,或是给一个反向迭代器赋值时,结果迭代器与原迭代器执行的并不是相同的元素。???
10.6泛型算法结构
输入迭代器输出迭代器
前向迭代器
双向迭代器
随机访问迭代器
1.算法形参模式
2.特殊容器算法
- 对于list和forward_list,应该优先使用成员函数版本的算法而不是通用算法。
lst.merge(lst2); lst.remove(val); lst.sort(); lst.unique();
splice成员
lst.splice()
这些算法和通用算法类似,但链表会改变底层容器
相关文章推荐
- C++ CreateProcess API创建进程
- C++静态成员变量和静态成员函数使用总结
- C++虚函数浅析
- 标准C++中的string类的用法总结
- C/C++报错
- C语言简洁+helloworld
- 浅析C/C++中sort函数的用法
- C语言 逆序显示文本内容并保存
- C语言 命令行传参进行 异或 加密/解密
- C++设计模式浅识策略模式
- getline()这个函数
- C++11尝鲜:右值引用和转发型引用
- 《C++ Concurrency in Action》读书笔记二 线程之间共享资源
- C++类型操作
- POJ 1862
- C++虚函数表解析
- C++随笔:.NET CoreCLR之GC探索(1)
- C++的函数名重载
- c++的强制类型转换
- 输出集合的所有子集(幂集)-C语言