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
网友评论