c++primer(第五版) 第十章 泛型算法习题答案

来源:互联网 发布:磁条读写器软件 编辑:程序博客网 时间:2024/05/22 15:28

第五版第九章以后的参考答案在网上很难找,于是就决定自己认真写一份,当做练习吧.

部分答案参考了github上大牛的代码.



10.1,    10.2

#include <iostream>#include <string>#include <vector>#include <algorithm>#include <list>using namespace std;int main(){    vector<int>v{1,2,3,4,5,6,7,8,9};    cout<<count(v.cbegin(), v.cend(),6)<<endl;    list<string>l{"the","quick","red","fox","jumps","over","the","slow","red","turtle"};    cout<< count(l.cbegin(), l.cend(),"the")<<endl;    return 0;}



10.3  10.4  10.5

#include <iostream>#include <string>#include <vector>#include <algorithm>#include <numeric>using namespace std;int main(){    vector<int>v {1,2,3,4,5,6,7,8,9};    cout<< accumulate(v.cbegin(), v.cend(),0)<<endl;    vector<double>v_d {1.1,2.2,3,14,5.1};    cout<< accumulate(v_d.cbegin(), v_d.cend(),0)<< endl;     //错误  初始累加和值为0(整型)  累加过程中会被强制转换为整型    cout<< accumulate(v_d.cbegin(), v_d.cend(),0.0)<< endl;    return 0;//    10.5//    结果为false//    c风格字符串equal要满足是同一块内存中的那一条字符串}






10.6 10.7 10.8

#include <iostream>#include <vector>#include <algorithm>using namespace std;int main(){    vector<int> vec {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};    fill_n(vec.begin(), vec.size(), 0);    for (auto i : vec)        cout << i << " ";    cout << endl;//    10.7//    (a)//    copy的第三个参数应该是一个插入迭代器//    (b)//    reserve是分配内存空间 并没有分配元素 应该使用resize//    10.8//    并不是标准库算法改变了容器大小 而是迭代器调用容器操作改变了容器大小}




10.9  10.10

#include<iostream>#include<vector>#include<algorithm>using namespace std;void elimDups(vector<string>& vec){    for(auto i:vec)        cout<<i<<" ";    cout<<endl;    sort(vec.begin(),vec.end());    for(auto i:vec)        cout<<i<<" ";    cout<<endl;    vector<string>::iterator it=unique(vec.begin(),vec.end());    for(auto i:vec)        cout<<i<<" ";    cout<<endl;    vec.erase(it,vec.end());    for(auto i:vec)        cout<<i<<" ";    cout<<endl;}int main(){    vector<string>vec{"the","quick","red","fox","jumps","over","the","slow","red","turtle"};    elimDups(vec);    return 0;}//    10.10//    @pezy: Cause the library algorithms operate on iterators, not containers. Thus, an algorithm cannot (directly) add or remove elements.//    标准库算法都是针对迭代器的操作,而不是容器,因此,它不能直接添加或删除元素.



10.11     10.13

#include<iostream>#include<vector>#include<algorithm>using namespace std;bool isShorter(const string&s1,const string& s2){    return s1.size()<s2.size();}bool part(const string& str1){    return str1.size()>=5?true:false;}void elimDups(vector<string>& vec){    sort(vec.begin(),vec.end());    vector<string>::iterator it=unique(vec.begin(),vec.end());    vec.erase(it,vec.end());}int main(){//    10.11    vector<string>vec{"the","quick","red","fox","jumps","over","the","slow","red","turtle"};    elimDups(vec);    stable_sort(vec.begin(),vec.end(),isShorter);    for(auto i:vec)        cout<<i<<" ";    cout<<endl;//    10.13    vector<string>vec2{"the","quick","red","fox","jumps","over","the","slow","red","turtle"};    partition(vec2.begin(),vec2.end(),part);    for(auto i:vec2)        cout<<i<<" ";    cout<<endl;    return 0;}



10.14  10.15   10.17  10.18

#include<iostream>#include<vector>#include<algorithm>#include"Sales_data.h"using namespace std;void elimdups(vector<string>& vs){    sort(vs.begin(), vs.end());    auto new_end = unique(vs.begin(), vs.end());    vs.erase(new_end, vs.end());}void biggies_partition(vector<string>& vs, int sz){    elimdups(vs);    auto pivot = partition(vs.begin(), vs.end(), [sz](const string& s) {return s.size() >= sz;});    for (auto it = vs.cbegin(); it != pivot; ++it) cout << *it << " ";}void biggies_stable_partition(vector<string>& vs, int sz){    elimdups(vs);    auto pivot =stable_partition(vs.begin(), vs.end(),[sz](const string& s) { return s.size() >= sz; });    for (auto it = vs.cbegin(); it != pivot; ++it) cout << *it << " ";}int main(){//    10.14    auto func=[](int a,int b)->int{return a+b;};//    10.15    int a=5;    auto func2=[a](int b)->int{return a+b;};//  10.17    Sales_data d1("aa"), d2("aaaa"), d3("aaa"), d4("z"), d5("aaaaz");    vector<Sales_data> v{d1, d2, d3, d4, d5};    sort(v.begin(), v.end(),[](const Sales_data& sd1, const Sales_data& sd2)         {return sd1.isbn().size() < sd2.isbn().size();});    for (const auto& element : v) cout << element.isbn() << " ";    cout << endl;//    10.18    vector<string>vec{"the","quick","red","fox","jumps","over","the","slow","red","turtle"};    biggies_partition(vec,5);    for(auto i:vec)        cout<<i<<" ";    cout<<endl;//    10.19    vector<string>vec2{"the","quick","red","fox","jumps","over","the","slow","red","turtle"};    biggies_stable_partition(vec2,5);    for(auto i:vec2)        cout<<i<<" ";    cout<<endl;    return 0;}




10.20   10.21

#include<iostream>#include<algorithm>using namespace std;int main(){//    10.20    vector<string>vec{"the","quick","red","fox","jumps","over","the","slow","red","turtle","ssssssss","ssssssaas"};    cout<<count_if(vec.cbegin(),vec.cend(),[](const string& str1){return str1.size()>6;})<<endl;//    10.21    int s=6;    int d=3;    auto f1=[&]()->int{        if(d<1)            return 0;        else        return --d;};    while(s--)        std::cout<<f1()<<" ";    return 0;}



10.22   10.23   10.24   10.25

#include<iostream>#include<vector>#include<algorithm>using namespace std;using namespace std::placeholders;bool check_size2(const string& str1,int sz){    return str1.size()<=sz;}void elimdups(std::vector<std::string>& vs){    std::sort(vs.begin(), vs.end());    auto new_end = std::unique(vs.begin(), vs.end());    vs.erase(new_end, vs.end());}bool check_size(const std::string& str,size_t sz){    return str.size()>=sz;}void biggies(std::vector<std::string>& vs, std::size_t sz){    using std::string;    elimdups(vs);    auto wc = std::stable_partition(vs.begin(), vs.end(),bind(check_size,_1,sz));    std::for_each(vs.begin(),wc, [](const string& s) { std::cout << s << " "; });}int main(){//    10.22    vector<string>vec{"the","quick","red","fox","aaaaaaa","jumps","over","bbbbbbbb","the","slow","red","turtle"};    auto it=partition(vec.begin(),vec.end(),bind(check_size2,_1,6));    for(auto i=vec.begin();i!=it;i++)        cout<<*i<<" ";    cout<<endl;//    10.23//    原函数有n个参数 则bind后有n+1个参数 第n+1个参数为原函数名//    10.24    vector<int>vec2{1,2,3,4,5,6,7,8,9,10};    string str="sssss";    auto it2=partition(vec2.begin(),vec2.end(),bind(check_size,str,_1));    cout<<*it2<<endl;//    10.25    std::vector<std::string> v{"1234", "1234", "1234", "hi~",                               "alan", "alan", "cp"};    biggies(v, 3);    cout <<endl;    return 0;}



10.27  10.28

#include<iostream>#include<vector>#include<list>#include<algorithm>using namespace std;int main(){    vector<int>v{1,2,3,4,5,6,7,8,9};//    10.27    list<int>lst;    unique_copy(v.begin(),v.end(),front_inserter(lst));    for(auto i:lst)        cout<<i<<" ";    cout<<endl;//    10.28    list<int>v2(20),v3(20),v4(20);    copy(v.begin(),v.end(),front_inserter(v2));    copy(v.begin(),v.end(),back_inserter(v3));    copy(v.begin(),v.end(),inserter(v4,v4.begin()));    for(auto i:v2)        cout<<i<<" ";    cout<<endl;    for(auto i:v3)        cout<<i<<" ";    cout<<endl;    for(auto i:v4)        cout<<i<<" ";    cout<<endl;    return 0;}



10.29   10.30   10.31    10.32    10.33

#include<iostream>#include<cstring>#include<iterator>#include<vector>#include<algorithm>#include<fstream>#include"Sales_item"using namespace std;void func(ifstream& in,const string& odd,const string& even){    ofstream f1(odd),f2(even);    ostream_iterator<int>os1(f1," "),os2(f2," ");    int temp;    while(in>>temp){        if(temp%2)            *os1++=temp;        else            *os2++=temp;    }}int main(){//    10.29    ifstream in("in.txt");    istream_iterator<string>start(in),eof;    vector<string>vec;    while(start!=eof)        cout<<*start++<<" ";//    10.30    vector<int>vec2;    istream_iterator<int>start2(cin),eof2;    copy(start2,eof2,back_inserter(vec));    sort(vec2.begin(),vec2.end());    copy(vec2.cbegin(),vec2.cend(),ostream_iterator<int>(cout," "));//    10.31    vector<int>vec3;    istream_iterator<int>start3(cin),eof3;    unique_copy(start3,eof3,back_inserter(vec2));    sort(vec3.begin(),vec3.end());    copy(vec3.cbegin(),vec3.cend(),ostream_iterator<int>(cout," "));//    10.32    istream_iterator<Sales_item> in_iter(cin), in_eof;    vector<Sales_item> vec4;    while (in_iter != in_eof) vec.push_back(*in_iter++);    sort(vec4.begin(), vec4.end(),         [](Sales_item const& lhs, Sales_item const& rhs) {             return lhs.isbn() < rhs.isbn();         });    for (auto beg = vec4.cbegin(), end = beg; beg != vec4.cend(); beg = end) {        end = find_if(beg, vec4.cend(), [beg](const Sales_item& item) {            return item.isbn() != beg->isbn();        });        cout << accumulate(beg, end, Sales_item(beg->isbn()))<< endl;    }//    10.33    ifstream is("in2.txt");    func(is,"f1.txt","f2.txt");    return 0;}



10.34   10.35  10.36  10.37

#include <iostream>#include <string>#include <list>#include <algorithm>using namespace std;int main(){//  10.34    list<int> v{1,2,3,0,4,5,6,7,8,9};                           for(auto i=v.crbegin();i!=v.crend();i++)        cout<<*i<<" ";    cout<<endl;//    10.35    auto i=--v.end();                                          while(i!=v.begin())        cout<<*i--<<" ";    cout<<*i<<endl;//    10.36    auto ans=find(v.crbegin(),v.crend(),0);                     auto loc=ans.base();    cout<<*loc<<endl;//    10.37    vector<int>v2{1,2,3,4,5,6,7,8,9};                           list<int>l;    copy(v2.crbegin()+2,v2.crbegin()+7,back_inserter(l));    for(auto i:l)        cout<<i<<" ";    return 0;}



10.39  10.40

#include <iostream>#include <string>#include <list>#include <algorithm>using namespace std;int main(){//    10.39//    list: 双向迭代器//    vector: 随机访问迭代器//    10.40//    copy: 第一,二个参数为输入迭代器  第三个为输出迭代器//    reverse:双向访问迭代器//    unique:前向迭代器    return 0;}



10.41

#include <iostream>#include <string>#include <list>#include <algorithm>using namespace std;int main(){//    10.41    replace(beg, end, old_val, new_val); // 在迭代器beg 和end 范围内 将old_val 替换成  new_val    replace_if(beg, end, pred, new_val); // 在迭代器beg 和end 范围内 将满足条件的pred的值替换成  new_val    replace_copy(beg, end, dest, old_val, new_val); // 将迭代器beg 和end 范围内的值拷贝到dest指向的容器中 并且在新容器中old_val 替换成了 new_val    replace_copy_if(beg, end, dest, pred, new_val); // 将迭代器beg 和end 范围内的值拷贝到dest指向的容器中 并且在新容器中满足条件的pred的值 替换成了 new_val    return 0;}




10.42

#include<iostream>#include<algorithm>#include<list>#include<string>using namespace std;int main(){    list<string>lst{"aaa","bbb","ccc","aaa","bb","bbbb","cc","ccc"};    lst.sort();    lst.unique();    for(auto i:lst)        cout<<i<<" ";    cout<<endl;    return 0;}



1 0