练习17.1
定义一个保存三个int值的tuple,并将其成员分别初始化为10、20和30。
解答:
#include <tuple>
#include <iostream>
int main(){
std::tuple<int, int, int> tuple1(10, 20, 30);
auto tuple2 = std::make_tuple(10, 20, 30);
std::cout << "tuple1 is " << std::endl;
std::cout << std::get<0>(tuple1) << std::endl;
std::cout << std::get<1>(tuple1) << std::endl;
std::cout << std::get<2>(tuple1) << std::endl;
std::cout << "tuple2 is " << std::endl;
std::cout << std::get<0>(tuple2) << std::endl;
std::cout << std::get<1>(tuple2) << std::endl;
std::cout << std::get<2>(tuple2) << std::endl;
}
练习17.2
定义一个tuple,保存一个string、一个vector<string>和一个pair<string, int>。
解答:
#include <tuple>
#include <iostream>
#include <string>
#include <vector>
#include <map>
int main(){
std::tuple<std::string, std::vector<std::string>, std::pair<std::string, int>> tuple0("hello", { "world", "one" }, {"two", 2});
std::cout << "tuple0 elements:" << std::endl;
std::cout << std::get<0>(tuple0) << std::endl;
std::cout << std::get<1>(tuple0).at(0) << std::endl;
std::cout << std::get<1>(tuple0).at(1) << std::endl;
std::cout << std::get<2>(tuple0).first << std::endl;
std::cout << std::get<2>(tuple0).second << std::endl;
}
练习17.3
重写12.3节(第430页)中的TextQuery程序,使用tupl代替QueryResult类。你认为那种设计更好,为什么?
解答:
在QueryResult中存储了三个变量,查询单词,出现行号,输出文件。
这个类,整个都可以用
tuple<std::string, std::share_ptr<std::set<line_no>>, std::share_ptr<std::vector<std::string>>> 类进行替换。
不过,对于这个元组结构,即使将std去掉也有些难于阅读,且不支持赋值构造。
所以,个人认为,还是用易与理解的QueryResult类进行记录,比较好。