第十章 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) 请立即联系我!