C++Primer第五版 11.2.2节练习
2015-09-25 15:06
465 查看
练习11.9:定义一个map,将单词与一个行号的list关联,list中保存的是单词所出现的行号。
练习11.10:可以定义一个
练习11.11:不使用decltype重新定义bookstore。
Sales_data.h
/* *C++Primer(第五版) *11.2.2节练习 *练习11.9 *问题描述:练习11.9:定义一个map,将单词与一个行号的list关联,list中保存的是单词所出现的行号。 * 注意:第二层的while循环,由于是list<int>类型,设置9999作为这层的结束标志 *作者:Nick Feng *邮箱:nickgreen23@163.com */ #include <iostream> #include <map> #include <list> #include <string> using namespace std; int main() { map<string,list<int>> word_container; string word; int number; while(cin >> word) { //数字输完之后,以 9999 作为标志结束这一层的while循环,不加 number != word,当输入下一个word时,由于输入流认为输入了不同的类型,因此结束了两层的while循环,结果只能显示第一行的 while(cin >> number && number != 9999) { word_container[word].push_back(number); } } //打印单词和行号 for(auto &w : word_container) { cout << w.first << " "; for(auto it = w.second.begin(); it != w.second.end();++it) { cout << *it << " "; } cout << endl; } return 0; }
练习11.10:可以定义一个
vector<int>::iterator到int的map吗?
list<int>::iterator到int的map呢?对于两种情况,如果不能,解释为什么?
/* *C++Primer(第五版) *11.2.2节练习 *练习11.10 *问题描述:练习11.10:可以定义一个vector<int>::iterator到int的map吗?list<int>::iterator到int的map呢?对于两种情况,如果不能,解释为什么? * 说明:这两种情况都可以 *作者:Nick Feng *邮箱:nickgreen23@163.com */ #include <iostream> #include <string> #include <map> #include <vector> #include <list> using namespace std; int main() { //这两种情况都可以 map<vector<int>::iterator,int> ma; map<list<int>::iterator,int> ma_li; return 0; }
练习11.11:不使用decltype重新定义bookstore。
/* *C++Primer(第五版) *11.2.2节练习 *练习11.11 *问题描述:练习11.11:不使用decltype重新定义bookstore。 * 说明:这道题是让你明白decltype(compareIsbn)*的类型究竟是什么,顺便复习了一下函数指针的内容 *作者:Nick Feng *邮箱:nickgreen23@163.com */ #include <iostream> #include <set> #include "Sales_data.h" using namespace std; bool compareIsbn(const Sales_data &lhs, const Sales_data &rhs) { return lhs.isbn() < rhs.isbn(); } int main() { //注释的地方为原始定义 //multiset<Sales_data,decltype(compareIsbn)*> bookstore(compareIsbn); bool (*pf)(const Sales_data &,const Sales_data &) = compareIsbn; //pf是指向compareIsbn函数的指针 //F是函数类型,不是指针,F*是一个带指针的复合类型,参考P223页 using F = bool(const Sales_data &,const Sales_data &); multiset<Sales_data,F*> bookstore(compareIsbn); }
Sales_data.h
/* *练习7.6 *2015/7、1 *问题描述:练习7.6:对于add, read和print,定义你自己的版本。 *功能:完善之前的类,定义成一个头文件 *作者:Nick Feng *邮箱:nickgreen23@163.com * */ #ifndef SALES_DATA_H #define SALES_DATA_H #include <iostream> #include <string> using namespace std; struct Sales_data{ string bookNo; unsigned units_sold = 0; double revenue = 0.0; string isbn() const {return bookNo;} Sales_data& combine(const Sales_data&); double avg_price() const; }; double Sales_data::avg_price() const{ if(units_sold) return revenue/units_sold; else return 0; } Sales_data& Sales_data::combine(const Sales_data &rhs){ units_sold += rhs.units_sold; revenue += rhs.revenue; return *this; } Sales_data add(const Sales_data&, const Sales_data&); ostream &print(ostream&, const Sales_data&); istream &read(istream&, Sales_data&); istream &read(istream &is, Sales_data &item) { double price = 0; is >> item.bookNo >> item.units_sold >> price; item.revenue = price * item.units_sold; return is; } ostream &print(ostream &os, const Sales_data &item) { os << item.isbn() << " " << item.units_sold<< " " << item.revenue<< " " << item.avg_price(); return os; } #endif
相关文章推荐
- C++ 嵌套类使用(三)
- C语言printf
- C++ 嵌套类使用(二)
- C++ 嵌套类使用(一)
- C语言 判断两个矩形是否相交
- c语言转移符和三字母序列
- C语言第一个例子hello world
- C++的那些事:类的拷贝控制
- c++基础---构造(析构)函数
- C++笔试题整理
- ubuntu下sublime text 2的编译配置及字体更改
- 一道关于C++继承类的面试题
- 浅谈C++类(4)--隐式类类型转换
- 谈C/C++指针精髓
- 判断是否是闰年
- 小题精炼-----初试C语言
- C++隐式转换各种发生情况
- VC++,掀起你的盖头来——谈VC++对象模型
- 在什么情况下Java比C++快?
- 用 Xcode 编写 C/C++ 的 Hello World!