C++Primer第五版 11.2.2节练习

时间:2023-02-13 20:13:45

练习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