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
