c++ primer第五版(中文)习题答案 第十章第三节第一小节-向算法传递函数

本博客知识记录自己学习中的笔记或者记录,如果有错误欢迎大家纠正。

本节初步了解泛型算法。

算法不能改变容器大小,切记

10.11编写程序,使用stable_sort和isShorter将传递给你的elimDups版本的vector排序,打印vector的内容,验证程序的正确性
代码如下

#include <vector>
#include <string>
#include "stdlib.h"
#include <iostream>
#include <iterator>
#include <algorithm>
//打印出容器中的数据
void pritef(std::vector<std::string> &word)
{
    for (auto s : word)
        std::cout << s << " ";
    std::cout << std::endl;
}
//比较函数,用来按长度排序
bool isShorter(const std::string &s1, const std::string &s2)
{
    return s1.size() < s2.size();
}
void elimDups(std::vector<std::string> &word)
{
    //按字典排序
    sort(word.begin(), word.end());
    //重排在范围的前部,返回指向不重复区域之后一个位置的迭代器。
    auto end_unique = unique(word.begin(), word.end());
    //使用容器操作erase删除后面的单词
    word.erase(end_unique, word.end());
}

int main()
{
    std::vector<std::string>vec;
    std::string s = "";
    while (std::cin >> s)
        vec.push_back(s);

    elimDups(vec);
    //按指定的排序规则(isShorter)排序
    stable_sort(vec.begin(), vec.end(), isShorter);
    pritef(vec);

    //暂停系统
    system("pause");
    return 0;
}

输出结果为
这里写图片描述

10.12 编写名为compareIsbn函数,比较两个Salse_data对象的isbn()成员,是这个函数排序一个保存Sales_data对象的vector。

//头文件
#include <iostream>

class Sales_data
{
public:
    Sales_data();
    ~Sales_data();
    //对输入流进行重载 记得要用做友函数
    friend inline std::istream & operator >> (std::istream & is, Sales_data &salesbook){
        is >> salesbook.ISBN;
        is >> salesbook.units_sold;
        is >> salesbook.revenue;
        return is;
    }

//成员变量,方便调用定位public
    std::string ISBN;
    unsigned int units_sold;
    double revenue;
};

Sales_data::Sales_data()
{   
//构造函数初始化成员变量
    ISBN = "";
    units_sold = 0;
    revenue = 0.0;
}

Sales_data::~Sales_data()
{
}
//源文件
#include <vector>
#include <string>
#include "stdlib.h"
#include <iostream>
#include <iterator>
#include <algorithm>
#include "10.12.h"
void pritef(std::vector<Sales_data> &word)
{
    for (auto s : word)
        std::cout << s.ISBN<<" "<<s.revenue<<" "   <<s.units_sold <<std::endl;
    std::cout << std::endl;
}
bool isShorter(const Sales_data &s1, const Sales_data &s2)
{

    //按isbn长短排序
    return s1.ISBN.size() < s2.ISBN.size();
}

int main()
{
    Sales_data book;
    std::vector<Sales_data>vecSale;
    while (std::cin >> book)//使用重载后的 输入流输入自定义对象
        vecSale.push_back(book);

//指定排序规则 进行排序
    stable_sort(vecSale.begin(), vecSale.end(), isShorter);
    pritef(vecSale);

    system("pause");
    return 0;
}

输出结果为
这里写图片描述

10.13标准库中定义了名为partition的算法,它接收一个谓词,对容器内容精选划分,使得谓词为true的值会排在容器前半段,而使谓词为false的值会排在后半段,算法返回一个迭代器,指向最后一个使谓词为true
的元素之后的位置位置。编写函数,接收string返回一个bool值,指出string是否有5个或者更多的字符,使用此函数划分words,打印长度大于五的函数。

#include <vector>
#include <string>
#include "stdlib.h"
#include <iostream>
#include <iterator>
#include <algorithm>

//比较函数
bool isShorter(const std::string &s1)
{

    //三目运算符,计算string.size是否大于等于5,大于等于返回真
    return s1.size() >= 5 ? true : false;
}

int main()
{
    std::vector<std::string>vecString;
    std::string s = "";
    //输入数据到容器中
    while (std::cin>>s)
    {
        vecString.push_back(s);
    }

//得到最后一个满足条件的
    auto last_true = partition(vecString.begin(), vecString.end(), isShorter);

//使用迭代器 限定范围在开始到最后一个为真的位置
    for (std::vector<std::string>::iterator it = vecString.begin(); it < last_true; it++)
        std::cout << *it << std::endl;


    system("pause");
    return 0;
}

这里写图片描述

仅供学习参考谢谢。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值