C++ Primer系列 第17章 标准库特殊设施
虽然我们不能详细介绍所有标准库设施,但仍有一些标准库设施在很多应用中都是有用的:tuple,bitset,正则表达式以及随机数。我们还将介绍一些附加的IO库功能:格式控制,未格式化IO和随机访问。
17.1 tuple类型
tuple是类似pair的模板。每个pair的成员类型都不相同,但每个pair都恰好有两个成员。不同tuple类型的成员类型也不相同,但一个tuple类型的成员数目可以与另一个tuple类型不同。
- 我们可以将tuple看作一个“快速而随意”的数据结构。
17.1.1 定义和初始化tuple
当我们定义一个tuple时,需要指出每个成员的类型:
tuple<size_t, size_t, size_t> threeD; // 三个成员都设置为0
tuple<string, vector<double>, int, list<int>>
someVal("constants", {
3.14, 2.718 }, 42, {
0,1,2,3,4,5 });
tuple的这个构造函数是explicit的,因此我们必须使用直接初始化语法:
tuple<size_t, size_t, size_t> threeD = {
1,2,3 }; // 错误
tuple<size_t, size_t, size_t> threeD{
1,2,3 }; // 正确
类似make_pair函数,标准库定义了make_tuple函数,我们还可以用它来生成tuple对象:
// 表示书店交易记录的tuple,包含:ISBN,数量和每册书的价格
auto item = make_tuple("0-999-78345-X", 3, 20.00);
类似make_pair,make_tuple函数使用初始值的类型来推断tuple的类型。在本例中,item是一个tuple,类型为tuple<const char*, int, double>
17.1.2 使用tuple返回多个值
tuple的一个常见用途是从一个函数返回多个值。例如,我们的书店可能是多家连锁书店中的一家。每家书店都有一个销售记录文件,保存每本书近期的销售数据。我们可能希望在所有书店中查询某本书的销售情况。
17.2 bitset类型
在4.8节中我们介绍了将整形运算对象当作二进制位集合处理的一些内置运算符。标准库还定义了bitset类,使得位运算的使用更为容易,并且能够处理超过最长整形类型大小的位集合。bitset类定义在头文件bitset中。
17.2.1 定义和初始化bitset
bitset类是一个类模板,它类似array,具有固定的大小。当我们定义一个bitset时,需要声明它包含多少个二进制位:
bitset<32> bitvec(1U); // 32位;底位为1,其他位为0
编号从0开始的二进制位被称为地位(low-order),编号到31结束的二进制位被称为高位(high-order)。
从一个string初始化bitset
我们可以从一个string或一个字符数组指针来初始化bitset。两种情况下,字符都直接表示位模式。与往常一样,当我们使用字符串表示数时,字符串中下标最小的字符对应高位,反之亦然:
bitset<32> bitvec4("1100"); // 2,3两位为1,剩余2位为0
如果string包含的字符数比bitset少,则bitset的高位被置为0.
- string的下标编号习惯与bitset恰好相反:string中下标最大的字符(最右字符)用来初始化bitset中的低位(下标为0的二进制位)。当你用一个string初始化一个bitset时,要记住这个差别。
17.2.2 bitset操作
使用bitset