
c++primer sales_iterm.h头文件,以及用流迭代器读取类类型对象的一个例子
发布日期:2021-05-07 00:55:22
浏览次数:25
分类:精选文章
本文共 3165 字,大约阅读时间需要 10 分钟。
sales_items.h
#ifndef INCLUDE_SALES_DATA_H#define INCLUDE_SALES_DATA_Hclass Sales_item{public: Sales_item(const std::string &book):isbn(book),units_sold(0),revenue(0.0){} Sales_item(std::istream &is){ is >> *this;} friend std::istream& operator>>(std::istream &,Sales_item &); friend std::ostream& operator<<(std::ostream &,const Sales_item &);public: Sales_item & operator+=(const Sales_item&);public: double avg_price() const; bool same_isbn(const Sales_item &rhs)const { return isbn == rhs.isbn; } Sales_item():units_sold(0),revenue(0.0){}public: std::string isbn; unsigned units_sold; double revenue;};using std::istream;using std::ostream;Sales_item operator+(const Sales_item &,const Sales_item &);inline bool operator==(const Sales_item &lhs,const Sales_item &rhs){ return lhs.units_sold == rhs.units_sold && lhs.revenue == rhs.revenue && lhs.same_isbn(rhs);}inline bool operator!=(const Sales_item &lhs,const Sales_item &rhs){ return !(lhs == rhs);}inline Sales_item & Sales_item::operator +=(const Sales_item &rhs){ units_sold += rhs.units_sold; revenue += rhs.revenue; return *this;}inline Sales_item operator+(const Sales_item &lhs,const Sales_item &rhs){ Sales_item ret(lhs); ret += rhs; return ret;}inline istream& operator>>(istream &in,Sales_item &s){ double price; in >> s.isbn >> s.units_sold >> price; if(in) s.revenue = s.units_sold * price; else s = Sales_item(); return in;}inline ostream& operator<<(ostream &out,const Sales_item &s){ out << s.isbn << "\t" <<< "\t" << s.revenue << "\t" << s.avg_price(); return out;}inline double Sales_item::avg_price() const{ if(units_sold) return revenue/units_sold; else return 0;}#endif
//程序用途:每次从cin读取一个Sales_item对象,如果读取的isbn和上一次的相同,那么读取的//对象加到前一个中,如果读取的isbn和前一次不一样,那么把前一次的结果输出,把新读入的元素存入//#include#include #include "sales_data.h"#include using namespace std;int main(){//新建一个istream的iterator,读取元素类型是Sales_item对象,该istream_iterator关联到//流cin,同时创建一个空流eof,当读取元素时候遇到流错误或者文件末尾时候,in_iter 就会等于eof istream_iterator in_iter(cin),eof;//创建一个ostream_iterator,输出元素类型是Sales_item,关联到流cout,且每次输出时候在末尾//加上"\n"ostream_iterator out_iter(cout,"\n");//创建Sales_item对象sum,并且用in_iter内的元素初始化,接着in_iter读取下一个值Sales_item sum =*in_iter ++;//创建while循环,当in_iter关联的流没有遇到错误,并且没有到达文件末尾的时候,循环继续while(in_iter != eof){//如果刚才读取的元素的isbn和sum中的Sales_data的isbn相等,那么把这个元素加到sum中,且//in_iter读取下一个值 if(in_iter -> isbn == sum.isbn) { sum += *in_iter ++; } //如果新读取的对象的isbn不等于sum中元素的isbn,那先输出sum中的对象,然后把新*in_iter//赋值给sum,然后in_iter再读取下一个值 else { *out_iter++ = sum; sum = *in_iter ++; }} return 0;}
注意几点用途:
1.istream_iterator对象关联到一个istream或者调用++运算符的时候,就会是的istream_iterator对象读取新值,例如:
istream_iterator<Sales_item> in_iter(cin); 这句in_iter关联到cin的同时就会从流cin读取一个值。
in_iter ++; //这句的意思是in_iter从cin读取一个新值
我自己的理解就是,istream_iterator读取新值也就是用和他关联的流读取新值
2.ostrem_iterator的流迭代器如何输出呢?只要把对象赋值给它就可以用它输出,例如:
out_iter = sum;
因为对ostream_iterator的流迭代器调用*,前自增++,后自增++,都对ostream_iterator不执行任何操作,所以也可以写成
*out_iter ++ = sum; //等价于out_iter = sum
3.输入流迭代器(就是istream_iterator类型,输入流迭代器是我自己取的名字),读取元素只需要调用前自增或者后自增++,而输出流迭代器要输出元素
就赋值就可以了,为了可读性以及以后好更改成其他流,可以加上一些诸如: ++ ,* 运算符。
发表评论
最新留言
第一次来,支持一个
[***.219.124.196]2025年04月14日 16时46分11秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
Java之封装,继承,多态
2021-05-09
wait()与notify()
2021-05-09
使用js打印时去除页眉页脚
2021-05-09
Spring security OAuth2.0认证授权学习第二天(基础概念-RBAC)
2021-05-09
ORA-00904: "FILED_TYPE": 标识符无效
2021-05-09
数据仓库系列之维度建模
2021-05-09
Scala教程之:函数式的Scala
2021-05-09
java中DelayQueue的使用
2021-05-09
线程stop和Interrupt
2021-05-09
Android中定时执行任务的3种实现方法
2021-05-09
nodejs中npm常用命令
2021-05-09
基于Vue2.0+Vue-router构建一个简单的单页应用
2021-05-09
基于vue2.0实现仿百度前端分页效果(二)
2021-05-09
JS魔法堂:函数重载 之 获取变量的数据类型
2021-05-09
时间序列神器之争:Prophet VS LSTM
2021-05-09
SpringBoot中关于Mybatis使用的三个问题
2021-05-09
MapReduce实验
2021-05-09
Leaflet 带箭头轨迹以及沿轨迹带方向的动态marker
2021-05-09
java大数据最全课程学习笔记(1)--Hadoop简介和安装及伪分布式
2021-05-09