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 == 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.

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,125评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,293评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,054评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,077评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,096评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,062评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,988评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,817评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,266评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,486评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,646评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,375评论 5 342
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,974评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,621评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,796评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,642评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,538评论 2 352

推荐阅读更多精彩内容