C++11——专门标准库设备

2019-05-14  本文已影响0人  铭小汁儿

标准库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 == t2t1 != 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名字是valuepublic 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,则返回truecountsize操作分别返回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的操纵器。此操纵器将流返回到其默认状态,在该状态下,它根据要打印的值选择表示法。
这些操纵器还会更改流的默认精度值。执行scientificfixed,或hexfloat后,精度值控制小数点后的位数。默认情况下,精度指定小数点前后的总位数。使用fixedscientific可让我们打印列中排列的数字,小数点位于相对于要打印的小数部分的固定位置:

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::hexfloatstd::defaultfloat,早期版本不支持这两个参数
关于hexfloat的更多信息可参考std::hexfloat
关于defaultfloat的更多信息可参考std::defaultfloat

参考文献

[1] Lippman S B , Josée Lajoie, Moo B E . C++ Primer (5th Edition)[J]. 2013.

上一篇下一篇

猜你喜欢

热点阅读