c++ primer 5th,练习11.19,编写代码验证
對于這個(gè)題,自己話費(fèi)2個(gè)多小時(shí)編寫了代碼,親自驗(yàn)證正確性,順便復(fù)習(xí)類的知識點(diǎn),下面采用分離式編譯自己把代碼放在三個(gè)文件中main.cc,function,sales_data.h,大家應(yīng)該根據(jù)文件名推斷各個(gè)文件的作用,main.cc主函數(shù),function.cc是定義函數(shù)的地方,sales_data.h是放置類和函數(shù)聲明的地方。代碼可以運(yùn)行,自己運(yùn)行過。還有一個(gè)數(shù)據(jù)文件,data.txt是存放數(shù)據(jù)的。
文件:sales_data.h
//文件sales_data.h #ifndef SALES_DATA_INCLUDE #define SALES_DATA_INCLUDE #include <iostream> #include <string> using namespace std; class Sales_data{ public:Sales_data() = default; Sales_data(istream &is); Sales_data(const string &s); Sales_data(const string &s,unsigned n,double p); const string isbn()const; friend istream &read(istream &is,Sales_data & lhs); friend ostream &print(ostream &os,const Sales_data &rhs); friend Sales_data add(const Sales_data &lhs,const Sales_data &rhs); Sales_data & combine(const Sales_data &rhs); private: string bookno; unsigned sales_count; double revenue;};#endif文件function.cc?
//文件 function.cc #include <string> #include <iostream> #include "sales_data.h" using namespace std; Sales_data::Sales_data(istream &is) { double price; is >> bookno >> sales_count >> price;revenue = price * sales_count; } Sales_data::Sales_data(const string &s):bookno(s),sales_count(0),revenue(0){} Sales_data::Sales_data(const string &s,unsigned n,double p):bookno(s),sales_count(n),revenue(n * p){} const string Sales_data::isbn()const{return bookno;} Sales_data & Sales_data::combine(const Sales_data &rhs){ revenue += rhs.revenue; sales_count += rhs.sales_count; return *this; } istream & read(istream &is,Sales_data &rhs) {double price;is >> rhs.bookno >> rhs.sales_count >> price;rhs.revenue = price * rhs.sales_count; return is; }ostream &print(ostream &os,const Sales_data &rhs) {os << "bookno:"<<rhs.bookno << endl;os << "\tbook sales-count:"<<rhs.sales_count << endl;os << "\tbook sales-revenue:"<<rhs.revenue << endl<<endl; return os; } Sales_data add(Sales_data &lhs,const Sales_data &rhs) {lhs.combine(rhs); return lhs; }文件main.cc?
#include <iostream> #include <string> #include <fstream> #include <set> #include <iterator> #include "sales_data.h" using namespace std;bool compareIsbn(const Sales_data &,const Sales_data &);typedef bool (*pf)(const Sales_data &,const Sales_data &); void print(multiset<Sales_data,pf> m); int main(int argc,char **argv) { ifstream in(argv[1]); multiset<Sales_data,pf> bookstore(compareIsbn); Sales_data data; while(read(in,data)) {bookstore.insert(bookstore.begin(),data); } print(bookstore);return 0; }void print(multiset<Sales_data,pf> m) { multiset<Sales_data,pf>::iterator it; for(it = m.begin();it != m.end();++it){print(cout,*it);}} bool compareIsbn(const Sales_data &lhs,const Sales_data &rhs) { return (lhs.isbn() < rhs.isbn()); }總結(jié),非undered關(guān)聯(lián)容器類型,如果自定義排序函數(shù),那么在定義這個(gè)關(guān)聯(lián)容器的時(shí)候,需要在類型中指定自定義比較函數(shù)(就是自己想用什么樣的排序規(guī)則,自己定義的那個(gè)返回bool的比較函數(shù))指針類型,在變量中后面需要緊跟比較函數(shù)名稱。(例如main.cc的第16行),但是在定義這個(gè)類型的形參的時(shí)候,變量名后面卻不需要加函數(shù)名稱。加了就錯。這個(gè)是我在本題得出的一個(gè)簡單結(jié)論。
?
數(shù)據(jù)文件data.txt,如下:
"abcde" 10 1.2 "abcd" 5 1.2 "aaa" 10 2.5 "isbn-isbn-isbn-isbn-abcd-efhg" 100 2.4自己在ubuntu20.04中編譯和執(zhí)行,命令和結(jié)果如下:
r@r:~/c++index/11.3.1/5$ g++ function.cc main.cc -o result r@r:~/c++index/11.3.1/5$ ./result data.txt bookno:"aaa"book sales-count:10book sales-revenue:25bookno:"abcd"book sales-count:5book sales-revenue:6bookno:"abcde"book sales-count:10book sales-revenue:12bookno:"isbn-isbn-isbn-isbn-abcd-efhg"book sales-count:100book sales-revenue:240由于時(shí)間關(guān)系,沒有驗(yàn)證更多函數(shù)。
所以本題中答案其實(shí)很明顯了,pf的定義就是本題要的答案,pf(函數(shù)compareIsbn函數(shù)的指針類型)定義如下:
雖然說了一堆,但是本題答案其實(shí)主要是需要定義函數(shù)compareIsbn的指針,是一句不起眼的代碼,下面就是:
typedef bool (*pf)(const Sales_data &,const Sales_data &);?
總結(jié)
以上是生活随笔為你收集整理的c++ primer 5th,练习11.19,编写代码验证的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c++ map利用迭代器赋值
- 下一篇: 问题:c语言简单的循环和字符串,错在哪里