C++ Primer 练习 10.32 题

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

雫和春的故事

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值