C++ Primer 练习 10.32 题

来源:互联网 发布:android蓝牙源码分析 编辑:程序博客网 时间:2024/06/13 07:26

第十章 10.32题:

题目:重写1.6节(第21页)中的书店程序,使用一个vector保存交易记录,使用不同算法完成处理。使用sort和10.3.1(第345页)中的compareIsbn函数来排序交易记录,然后使用find和accumulate求和。

先来解释一下这一题的题目:       。。。无解。

其实   我阅题能力真的是为0.一时间还看不出啥来。

先定义vector来保存Sales_item的容器,这个很好理解嘛。

再来是 使用不同算法完成处理:也就是随便用一种方式来保存一个交易记录。

还有就是sort 和 一个谓词 ,来排序vector里的元素 根据isbn()打字典顺序,这个很简单。

最后用find和accumulate 来 ,这个当时还想了一下。

首先要先找到一个元素,也就是要提供一个ISBN名字。才能下一步的计算。当时我惊呆了,还有这种操作!!

find的 确实写不出啊,怎么找到,提供一个ISBN的话 也不行啊。算法不允许有这种操作。

所以只能用find_if , 喂,喂,喂 ,犯规了 ,(逃

可是我真的想不出了啊 所以还是犯规一次,其实还有其他更简单的实现方法。( •̀ ω •́ )y 算了!

下面  高能 预警!!!!!!

代码来了 各位大大可以参考一下。


#include <iostream>#include <vector>#include <string>#include <functional>#include <algorithm>#include <numeric>#include <iterator>#include "Sales_item.h"#include <fstream>using namespace std;bool comIsbn(Sales_item &s1, Sales_item &s2){return s1.isbn() < s2.isbn();}int main(){istream_iterator<Sales_item> sa_in(cin),eof;vector<Sales_item> sales(sa_in,eof);//未排序前for_each(sales.cbegin(), sales.cend(), [](const Sales_item &s) {cout << s << '\n'; });sort(sales.begin(), sales.end(),comIsbn);cout << endl;//排序后for_each(sales.cbegin(), sales.cend(), [](const Sales_item &s) {cout << s << '\n'; });//使用find_if 先找到 第一个给定的ISBN 然后返回该元素的迭代器auto begin = find_if(sales.cbegin(), sales.cend(), [](const Sales_item &s) {return s.isbn() == "hh"; }); //找到第一个//之后就从这个迭代的位置找到第一个不等于ISBN的元素,然后返回迭代器auto end = find_if(begin, sales.cend(), [](const Sales_item &s) {return s.isbn() != "hh"; });  // 找到在第一个之后不一样的值之后的cout << endl;//再次打印表示正确for_each(begin,end, [](const Sales_item &s) {cout << s << '\n'; }); //这是查找的值  稳!cout << endl;//之后从这两个迭代器范围计算求和cout << accumulate(begin,end,Sales_item("hh")) << endl; //求和之后的值打印出来return 0;}


就是这样 很简单把 尽力局!

有什么错误的地方还是说这个答案就是错误的(T_T) 请立即联系我!