美文网首页
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