美文网首页
c++primer 14.42-14.53

c++primer 14.42-14.53

作者: 青吟乐 | 来源:发表于2019-06-16 07:16 被阅读0次

14.42

    std::count_if(ivec.cbegin(), ivec.cend(), std::bind(std::greater<int>(), _1, 1024));//绑定greater的函数  _1一个参数,第二个参数是1024
    std::find_if(ivec.cbegin(), ivec.cend(),std::not_equal_to<string>(), _1, "pooh");//绑定not_equal_to 的函数,_1一个参数,比较对象是“pooh”
    std::transform(ivec.begin(), ivec.end(), ivec.begin(), std::bind(std::multiplies<int>(), _1, 2));//绑定multiplies的函数,_1一个参数,2是指*2

14.43

#include <iostream>
#include <string>
#include <functional>
#include <algorithm>

int main()
{
    auto data = { 2, 3, 4, 5 };
    int input;
    std::cin >> input;
    std::modulus<int> mod;
    auto predicator = [&](int i) { return 0 == mod(input, i); };
    //any_of采用序列和谓词。 如果谓词对于序列中的任何元素返回true,它将返回true
    auto is_divisible = std::any_of(data.begin(), data.end(), predicator);
    std::cout << (is_divisible ? "Yes!" : "No!") << std::endl;

    return 0;
}

14.44

#include <iostream>
#include <string>
#include <functional>
#include <algorithm>
#include <vector>
#include<map>
using namespace std;
int add(int i,int j){
    return i+j;
}
auto mod = [](int i,int j){
    return i%j;
};
class devide{
public:
    int operator()(int a,int b){ return a/b;}
};
int main()
{



    std::map<std::string,function<int(int,int)>> binops = {
    {"+",add},
    {"-",std::minus<int>()},
    {"/",devide()},
    {"*",[](int i,int j){return i*j;}},
    {"%",mod},
    };


    binops["+"](10,5);                                      //调用add(10,5)
    binops["-"](10,5);                                      // 调用minus<int> 对象的调用运算符
    binops["/"](10,5);                                      //使用divide对象的调用运算符
    binops["*"](10,5);                                      //lambda
    binops["%"](10,5);                                      //lambda


    while (std::cout << "依次输入左操作数,运算符,右操作数(以空格间隔)\n", true)
    {
        int lhs, rhs; std::string op;
        std::cin >> lhs >> op >> rhs;
        std::cout << binops[op](lhs, rhs) << std::endl;
    }

    return 0;
}

14.45
此题搬运,没有去找自己原来写的类的代码。。。。
首先是类与方法

#include <string>
#include <iostream>

class Sales_data
{
    friend std::istream& operator>>(std::istream&, Sales_data&);
    friend std::ostream& operator<<(std::ostream&, const Sales_data&);
    friend Sales_data operator+(const Sales_data&, const Sales_data&);

public:
    Sales_data(const std::string &s, unsigned n, double p) :bookNo(s), units_sold(n), revenue(n*p) {}
    Sales_data() : Sales_data("", 0, 0.0f) {}
    Sales_data(const std::string &s) : Sales_data(s, 0, 0.0f) {}
    Sales_data(std::istream &is);

    Sales_data& operator=(const std::string&);
    Sales_data& operator+=(const Sales_data&);
    explicit operator std::string() const { return bookNo; }
    explicit operator double() const { return avg_price(); }

    std::string isbn() const { return bookNo; }

private:
    inline double avg_price() const;

    std::string bookNo;
    unsigned units_sold = 0;
    double revenue = 0.0;
};

std::istream& operator>>(std::istream&, Sales_data&);
std::ostream& operator<<(std::ostream&, const Sales_data&);
Sales_data operator+(const Sales_data&, const Sales_data&);

inline double Sales_data::avg_price() const
{
    return units_sold ? revenue / units_sold : 0;
}
Sales_data::Sales_data(std::istream &is) : Sales_data()
{
    is >> *this;
}

Sales_data& Sales_data::operator+=(const Sales_data &rhs)
{
    units_sold += rhs.units_sold;
    revenue += rhs.revenue;
    return *this;
}

std::istream& operator>>(std::istream &is, Sales_data &item)
{
    double price = 0.0;
    is >> item.bookNo >> item.units_sold >> price;
    if (is)
        item.revenue = price * item.units_sold;
    else
        item = Sales_data();
    return is;
}

std::ostream& operator<<(std::ostream &os, const Sales_data &item)
{
    os << item.isbn() << " " << item.units_sold << " " << item.revenue << " " << item.avg_price();
    return os;
}

Sales_data operator+(const Sales_data &lhs, const Sales_data &rhs)
{
    Sales_data sum = lhs;
    sum += rhs;
    return sum;
}

Sales_data& Sales_data::operator=(const std::string &isbn)
{
    *this = Sales_data(isbn);
    return *this;
}

然后是测试

    Sales_data cp5("C++ Primer 5th", 4, 106.5);
    std::cout << cp5 << std::endl;
    std::cout << static_cast<std::string>(cp5) << std::endl;
    std::cout << static_cast<double>(cp5) << std::endl;

14.46
应该,只有显式的使用才产生类型转变,防止意外情况
14.47

operator const int();

const 在前决定返回值类型为int 无意义,因为类型转化就是转化成int

operator int() const ;

决定数值无法修改,正常类型转换
14.48
我当时是book类,应该有bool类型转换,并且应该设置为显式的,因为使用场景可能单一,比如用的到书号什么啊,避免隐式转换的意外操作
14.49
explicit operator bool() { return (book_no<26) ? true : false; }

14.50

相关文章

网友评论

      本文标题:c++primer 14.42-14.53

      本文链接:https://www.haomeiwen.com/subject/ztrwfctx.html