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

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

部分答案参考了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
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值