练习11.9:定义一个map,将单词与一个行号的list关联,list中保存的是单词所出现的行号。
/* *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