标签: C++Primer 学习记录 tuple 正则表达式 随机数 IO库
tuple
类型。与 pair类似,但 tuple可以有任意数量的成员。它的一个常见用途就是从一个函数返回多个值。
tuple_size
和 tuple_element
,可以查询 tuple成员的数量和类型。不过使用这两个类,必须知道 tuple对象的类型,这可以通过 decltype很简单地得到。
typedef decltype(item) trans; // 返回 trans类型对象中成员的数量 size_t sz = tuple_size<trans>::value; // 返回 3 // cnt的类型与 item中第二个成员相同,是一个 int tuple_element<1, trans>::type cnt = get<1>(item);
==
或 <
是合法时,才能比较两个 tuple。另外,由于 tuple定义了 <和 ==运算符,可以将 tuple序列传递给算法,并且可以在无序容器中将 tuple作为关键字类型。
// bitvec1比初始值小,初始值中的高位被丢弃 bitset<13> bitvec1(oxbeef); // 二进制位序列为 1111011101111 // bitvec2比初始值大,它的高位被置为 0 bitset<20> bitvec2(oxbeef); // 二进制位序列为 00001011111011101111 // 在 64位机器中,long long 0ULL是 64个 0比特,因此 ~0ULL是 64个 1 bitset<20> bitvec3(~0ULL); // 0~63位为 1,64~127位为 0
bitset<32> bitvec4("1100"); // 2、3两位为 1,剩余位为 0
<<
和 >>
运算符,对于输入运算符 <<
,直到读取的字符数达到对应 bitset的大小时,或遇到不是 1或 0 的字符时,或是遇到文件尾或输入错误时,读取过程才停止。
regex_search
或 regex_match
来验证给定的字符序列是否与此模式匹配。如果输入序列中一个子串与表达式匹配,则 regex_search
函数返回 true。注意,该函数只要找到一个匹配子串就会停止查找。
// 非 c字母后接 ei string pattern("[^c]ei"); // 包含 pattern的整个单词 pattern = "[[:alpha:]]*" + pattern + "[[:alpha:]]*"; regex r(pattern, regex::icase); // 忽略大小写 smatch results; // 定义一个对象保存搜索结果 // 定义一个 string保存待查询的文本 string test_str = "receipt freind theif receive"; // 用 r在 test_str中查找与 pattern匹配的子串 if (regex_search(test_str, results, r)) cout << results.str() << endl;
sregex_iterator
绑定到一个 string和一个 regex对象时,迭代器自动定位到给定 string中第一个匹配位置。解引用这个迭代器,则会得到一个 smatch
对象。如果正则表达式中的模式包含一个或多个子表达式时,得到的 smatch对象中还会包含多个 ssmatch
对象,表示与模式中每个子表达式的匹配信息。
format_no_copy
不输出输入序列中未匹配的部分,format_first_only
只替换第一次出现的子表达式。
// 将电话号码进行转换,只返回它替换的文本
string phone =
"(\\()?(\\d{3})(\\))?([-. ]*)?(\\d{3})([-. ]*)?(\\d{4})";
regex r(phone);
string fmt{"$2.$5.$7"};
string number = "morgan (908) 555-1800";
// 实际输出 908.555.1800
cout << regex_replace(number, r, fmt, format_no_copy) << endl;
;
rand
来生成随机数。此函数生成均匀分布的伪随机整数,每个随机数的范围在 0和一个系统相关的最大值(至少为 32767)之间。但是当程序需要不同范围的随机数、随机浮点数或非均匀分布的数时,就需要程序员自己进行类型转换了,而这往往会引入非随机性。
uniform_real_distribution
。
showbase
操纵符,可以在输出结果中显示进制。
noskipws
可以令输入运算符读取空白符,而不是跳过它们。