C++11——专门标准库设备
标准库tuple类模版
tuple
是一个与pair
相似的模版。每个pair
类型的成员都有不同的类型,但每个pair
总是只有两个成员。tuple
也具有不同类型的成员,但是tuple
可以具有任意数量的成员。每个不同的tuple
都有固定数量的成员,但是一个tuple
类型中的成员数量可以不同于另一个tuple
类型中的成员数量。
当我们想要将一些数据组合到单个对象中但又不想费心定义数据结构来表示这些数据时,tuple
最有用。下面列出了tuple
支持的操作。tuple
类型及其伴随类型和函数在头文件<tuple>
中定义。
tuple<T1, T2, ..., Tn> t;
:t
是一个具有类型为T1...Tn
,且数量与类型个数一样多的成员的tuple
。这些成员默认进行值初始化。
tuple<T1, T2, ..., Tn> t(v1, v2, ..., vn);
:与上面操作功能类型。只不过利用初始化器中vi
的值对t
的成员进行初始化。这个构造函数是explicit
的。
make_tuple(v1, v2, ..., vn)
:返回一个由给定的初始化器进行初始化的tuple
。这个tuple
的类型由初始化器中的元素类型推理得到。
t1 == t2
、t1 != t2
:如果两个tuple
具有相同数量的成员以及每个成员的类型也相同,那么这两个tuple
相等。比较过程中,一旦发现某个成员不相等,那么剩余成员将不进行测试,同时比较过程使用每个成员的底层==
运算符。
t1 relop t2
:使用字典排序对tuple
进行关系运算。tuple
必须具有相同数量的成员。使用运算符<
将t1
的成员与来自t2
的相应成员进行比较。
get<i>(t)
:返回t
的第i个数据成员的引用;如果t
是一个左值,那么结果为一个左值引用;否则,结果是一个右值引用。tuple
的所有成员都是public
的。
tuple_size<tupleType>::value
:一个类模版,可以通过tuple
类型实例化,并且有一个类型为size_t
名字是value
的public constexpr static
数据成员。它指明了tuple
类型中的成员数。
tuple_element<i, tupleType>::type
:一个类模板,可以通过整型常量和tuple
类型进行实例化,并且具有一个名为type
的公共成员,它是指明tuple
类型中特定成员的类型。
关于tuple
更多的信息可参考std::tuple。
新的bitset操作
bitset
操作定义了测试或设置一个或多个位(bit)的各种方法。bitset
类还支持按位运算符。运算符在应用于bitset
对象时与内置运算符应用于unsigned
操作数时具有相同的含义。
bitset
对象的一个或多个位为1时,在bitset
中定义的any
操作返回true
。相反,如果所有位都为零,则none
返回true
。 新标准引入了all
操作,如果所有位都为1,则返回true
。count
和size
操作分别返回size_t
,其大小分别等于设置的位数和对象中的总位数。size
函数是constexpr
,因此可以在需要常量表达式的情况下使用。
对于bitset
定义的其他相关操作可参考std::bitset。
正则表达式库
正则表达式是一种描述字符序列的方式。正则表达式是一种非常强大的计算设备。正则表达式库(RE library),它是新标准库的一部分。RE library在头文件<regex>
中定义,下面列出了正则表达式库的几个组件:
regex
:表示一个正则表达式的类。
regex_match
:将一个字符序列与正则表达式进行匹配。
regex_search
:找出第一个与正则表达式匹配的子列。
regex_replace
:使用一个给定的格式代替一个正则表达式。
regex_iterator
:迭代器适配器,调用regex_search
来迭代字符串中的匹配项。
smatch
:容器类,用于储存对一个字符串的搜索结果。
ssub_match
:字符串中匹配的子表达式的结果。
关于正则表达式库更多地信息可参考<regex>。
随机数库
程序通常需要随机数源。在新标准之前,C和C++都依赖于一个名为rand
的简单C库函数。该函数产生的伪随机整数均匀分布在从0到系统相关的最大值(至少为32767)的范围内。
rand
函数有几个问题:许多(如果不是大多数)程序需要与rand
生成的范围不同的随机数。某些应用程序需要随机浮点数。有些程序需要反映不均匀分布的数字。程序员在尝试转换由rand生成的数字的范围,类型或分布时,通常会引入非随机性。
头文件<random>
中定义的随机数库通过一组协作类来解决这些问题:随机数引擎和随机数分布类。随机数引擎生成一系列无符号随机数。随机数分布类使用引擎来生成在给定范围内根据特定概率分布分布的指定类型的随机数。下面我们将描述了这两个类:
类 | 描述 |
---|---|
Engine | Types that generate a sequence of random unsigned integers |
Distribution | Types that use an engine to return numbers according to a particular probability distribution |
注:C++程序不应使用库函数rand
。相反,他们应该使用default_random_engine
以及适当的分布类对象。
Code:
default_random_engine e; // generates random unsigned integers
for (size_t i = 0; i < 10; ++i)
// e() "calls" the object to produce the next random number
cout << e() << " ";
关于随机数库更多信息可参考<random>。
浮点格式控制
我们可以通过使用适当的操纵器强制流使用科学,固定或十六进制表示法表示浮点数。scientific
操纵器更改流以使用科学记数法。fixed
操纵器将流更改为使用固定小数。
在新库下,我们还可以通过使用hexfloat
强制浮点值使用十六进制格式。新库提供了另一个名为defaultfloat
的操纵器。此操纵器将流返回到其默认状态,在该状态下,它根据要打印的值选择表示法。
这些操纵器还会更改流的默认精度值。执行scientific
,fixed
,或hexfloat
后,精度值控制小数点后的位数。默认情况下,精度指定小数点前后的总位数。使用fixed
或scientific
可让我们打印列中排列的数字,小数点位于相对于要打印的小数部分的固定位置:
Code:
cout << "default format: " << 100 * sqrt(2.0) << '\n'
<< "scientific: " << scientific << 100 * sqrt(2.0) << '\n'
<< "fixed decimal: " << fixed << 100 * sqrt(2.0) << '\n'
<< "hexadecimal: " << hexfloat << 100 * sqrt(2.0) << '\n'
<< "use defaults: " << defaultfloat << 100 * sqrt(2.0)
<< "\n\n";
产生下列结果:
default format: 141.421
scientific: 1.414214e+002
fixed decimal: 141.421356
hexadecimal: 0x1.1ad7bcp+7
use defaults: 141.421
默认情况下,十六进制数字和科学计数法中使用的e
以小写字母打印。 我们可以使用uppercase
操纵器以大写形式显示这些值。
注:GCC 5.2(C++11)开始支持std::hexfloat
和std::defaultfloat
,早期版本不支持这两个参数
关于hexfloat
的更多信息可参考std::hexfloat。
关于defaultfloat
的更多信息可参考std::defaultfloat。
参考文献
[1] Lippman S B , Josée Lajoie, Moo B E . C++ Primer (5th Edition)[J]. 2013.