[2018年6月9号]C++ primer 课后练习 第十七章 标准库的特殊设施

xiaoxiao2021-02-28  54

17.4

typedef tuple<vector<Sales_data>::size_type, vector<Sales_data>::iterator, vector<Sales_data>::iterator> matches; vector<matches> findBook(vector<vector<Sales_data>> & files, const string& s){ vector<matches > ret; for(auto it = files.begin(); it != files.end();it++){ auto range = equal_range(it->begin(),it->end(), s,compareIsBn); if(range.first!=range.second){ ret.push_back(make_tuple(it->end()-it->begin(),it->begin(),it->end())); } } return ret; }17.5 typedef pair<int, pair<vector<Sales_data>::iterator, vector<Sales_data>::iterator>> matches_pair; vector<matches_pair> findBook(vector<vector<Sales_data>> & files, const string& s) { vector<matches_pair> ret; for(auto it = files.begin(); it != files.end();it++){ auto range = equal_range(it->begin(),it->end(), s,compareIsBn); if(range.first!=range.second){ ret.push_back({ it - files.begin(),{range.first, range.second}}); } } return ret; }17.6 struct matches_struct { int slot; vector<Sales_data>::iterator begin; vector<Sales_data>::iterator end; }; vector<matches_struct> findBook(vector<vector<Sales_data>> & files, const string& s) { vector<matches_struct> ret; for (auto it = files.begin(); it != files.end(); it++) { auto range = equal_range(it->begin(), it->end(), s, compareIsBn); if (range.first != range.second) { ret.push_back({ it - files.begin(), range.first, range.second }); } } return ret; }

17.7

在该例中,pair略占优势吧,与tuple相比,所需返回的3个元素不是同一层级,索引和迭代器是两种对查询结果不同的描述,将迭代器和索引分离开显得更为合适,而tuple将其放在统一层级里,不是显得很合适,而不使用tuple和pair的版本需要额外创建一个结构来存放所需返回的结果,显然是一些不是很有必要的代码

17.8

Sales_data()将作为初始元素,将返回与所有查询结果相加的结果

17.9

a.32将转换成二进制初始化bitvec从低位到高位,不足64的置为0

b.1010101将转换成二进制初始化bv,但超过32位被舍弃

c.str将的高位将从0开始,str字符最小的对应最高位初始化,其他位置为0

转载请注明原文地址: https://www.6miu.com/read-2620380.html

最新回复(0)