C++Primer第五版 第十章习题答案(21~30)

来源:互联网 发布:野蛮时代 知乎 编辑:程序博客网 时间:2024/05/16 09:17

21:知识点1:值捕获想修改变量的话,可以在参数列表后加mutable进行修改。引用捕获也必须是非const的变量才可以进行修改

知识点2:若不明显指出返回类型,需要在参数列表之后位置返回类型:->bool。

#include<iostream>#include<string>#include<vector>#include<algorithm>#include<numeric>using namespace std;int main(int argc, char**argv){int i = 5;auto f = [&i]()->bool {if (i == 0){return true;} else{--i;return false;}};//引用捕获、尾置返回类型int j = f();cout<<j<<endl;;return 0;}

22:知识点:对于那种只在一两个地方使用的简单操作,lambda是非常有用的。但是若需要在不同的地方使用相同的操作,通常应该定义一个函数。

#include<iostream>#include<string>#include<vector>#include<algorithm>#include<numeric>using namespace std;bool func(string &s){return s.size()<=6;}int main(int argc, char**argv)  {  string a[10] = {"diuwudh","udh","dewiudh","wudh","diutrwu","h","diuw","diuwudhg257","h","d"};  vector<string> vec1(a,a+10);//利用数组初始化vector  cout<<"长度小于等于6的字符串有"<<count_if(vec1.begin(),vec1.end(),func)<<"个";  return 0;  }  

23:知识点:bind()函数,头文件为functional,作用是将参数隐式的增多,接受一个可调用参数,生成一个新的可调用对象。

auto func1 = bind(func2, _1,sz);//_n表示占位符,由func1调用时提供。调用func1时,就会替换为func2函数。

n表示占位符的个数的话,bind的参数数为n+1个,多出来一个参数是为了让它能够找到自己。


24:知识点:bind()作用很多,可以直接颠倒参数的顺序,绑定引用的参数必须使用ret函数和cref函数

#include<iostream>#include<string>#include<vector>#include<algorithm>#include<numeric>#include<functional>//必须using namespace std;using std::placeholders::_1;//必须bool check_size(const int &s, string::size_type sz){return sz > s;}int main(int argc, char**argv)  {  string _string = "MyLove";//给定一个stringint a[10] = {5,5,6,8,5,4,9,5,2,4};  vector<int> vec1(a,a+10);//利用数组初始化vector  string::size_type _length = _string.size();//使用bind不仅需要头文件,还需要声明命名空间cout<<"长度小于等于6的字符串有"<<count_if(vec1.begin(),vec1.end(),bind(check_size, _1, _length))<<"个";  return 0;  }  

25:知识点:bind()的作用就是将参数直接增多

#include<iostream>  #include<string>  #include<vector>  #include<algorithm>  #include<numeric>  #include<functional>using namespace std;using namespace placeholders;//占位符的命名空间void elimDups(vector<string> &s)  {  sort(s.begin(),s.end());//sort排序  vector<string>::iterator str = unique(s.begin(),s.end());//unique排序  s.erase(str,s.end());//erase()操作      }  bool check_size(const string &s, string::size_type sz){return s.size()<=sz;}void biggis(vector<string> &s, vector<string>::size_type sz)  {  elimDups(s);//字典排序、删除重复  stable_sort(s.begin(),s.end(),[](const string &a,const string &b){return a.size()<b.size();});//按长度排序  auto it1 = partition(s.begin(),s.end(),bind(check_size,_1,sz)/*[sz](const string &s){return s.size()<=sz;}*/);  for (it1; it1 != s.end(); ++it1)  {  cout<<*it1<<" ";  }  }  int main(int argc, char**argv)  {  string a[10] = {"diuwudh","udh","diudh","wudh","diuwu","h","diuw","diuwudhg257","h","d"};  vector<string> vec1(a,a+10);//利用数组初始化vector  biggis(vec1,4);//找出长度大于4的字符串  return 0;  }  

26:知识点1:几种特殊的迭代器—实际上相当于一个泛型算法,接受一个容器作为参数,产生一个迭代器,将元素插入容器之中

插入迭代器:这些迭代器绑定到容器上,可以用来向容器插入元素

流迭代器:绑定到输入输出流上,用来遍历所有关联的IO流

反向迭代器:向后移动而不是向前移动,出了forward_list其他容器都有

移动迭代器:移动容器中的元素

知识点2:插入器,接受一个容器作为参数,生成一个迭代器,可以向容器中添加元素。++it,it++,*it都不会产生任何效果,只能返回it(插入迭代器),it = t 在it指向的位置插入元素t。

知识点3:插入迭代器分为三种:back_inserter()创建一个使用push_back的迭代器,front_inserter()创建一个push_front的迭代器,inserter()创建一个insert迭代器,接受两个参数。插入到指定迭代器之前。(前提是容器必须支持push_back()的操作


区别就是其具体的工作过程,front_insert()最为特殊,总是将元素插在容器之首位置。


27:知识点:unique_copy():拷贝不重复元素,back_insert():插入迭代器(需包含iterator头文件)

#include<iostream>  #include<string>  #include<vector>  #include<algorithm>  #include<numeric>  #include<functional>#include<iterator>using namespace std;using namespace placeholders;//占位符的命名空间int main(int argc, char**argv)  {  string a[10] = {"love","love8","love","love","love","h","diuw","diuwudhg257","love","d"};  vector<string> vec1(a,a+10);//利用数组初始化vector  vector<string> vec2;//实现包含头文件iteratorunique_copy(vec1.cbegin(),vec1.cend(),back_inserter(vec2));//不支持push_front?cout<<"字符串中的不重复字符为:";for (int i = 0; i<vec2.size(); ++i){cout<<vec2[i]<<" ";}return 0;  }  

28:

#include<iostream>  #include<string>  #include<vector>  #include<algorithm>  #include<numeric>  #include<functional>#include<iterator>using namespace std;using namespace placeholders;//占位符的命名空间int main(int argc, char**argv)  {  int a[10] = {1,2,3,4,5,6,7,8,9};  vector<int> vec1(a,a+9);//利用数组初始化vector  vector<int> vec2;vector<int> vec3;vector<int> vec4;//实现包含头文件iteratorcopy(vec1.cbegin(),vec1.cend(),back_inserter(vec2));copy(vec1.cbegin(),vec1.cend(),front_inserter(vec3));//不支持push_front?,vector这个容器不支持copy(vec1.cbegin(),vec1.cend(),inserter(vec4,vec4.begin()));cout<<"vec2字符为:";for (int i = 0; i<vec2.size(); ++i){cout<<vec2[i]<<" ";}cout<<endl<<"vec3字符为:";for (int i = 0; i<vec3.size(); ++i){cout<<vec3[i]<<" ";}cout<<endl<<"vec4字符为:";for (int i = 0; i<vec4.size(); ++i){cout<<vec4[i]<<" ";}return 0;  }  

29:知识点:io迭代器将他们对应的流当作特定类型的元素序列来处理。通过使用流迭代器,可以用泛型算法从流中对象读取数据以及写数据

#include<iostream>  #include<fstream>#include<string>  #include<vector>  #include<algorithm>  #include<numeric>  #include<functional>#include<iterator>using namespace std;using namespace placeholders;//占位符的命名空间int main(int argc, char**argv)  {  vector<string> vec1;ifstream in1("1.txt");//不允许使用不完整类型,是因为没有头文件~~istream_iterator<string> str(in1);istream_iterator<string> end;//尾后迭代器copy(str,end,back_inserter(vec1));//存入vec1for (int i = 0; i < vec1.size(); ++i){cout<<vec1[i]<<endl;}return 0;  }  

30:

#include<iostream>  #include<fstream>#include<string>  #include<vector>  #include<algorithm>  #include<numeric>  #include<functional>#include<iterator>using namespace std;using namespace placeholders;//占位符的命名空间int main(int argc, char**argv)  {  vector<int> vec1;//创建流迭代器、尾后迭代器,最好是这样,放在一起,不然很可能类型不同就会报错istream_iterator<int> str(cin), end;//!=左右两边得是可以比较的嘛!// while (str != end)// {// vec1.push_back(*str++);// // }//此操作和copy一样的效果,只不过要记得++.copy(str,end,back_inserter(vec1));//存入vec1sort(vec1.begin(),vec1.end());//不能用cbegin(),我日for (int i = 0; i < vec1.size(); ++i){cout<<vec1[i]<<endl;}return 0;  } 


1 0
原创粉丝点击