C 11学习笔记 16

发布 2021-05-12 11:13:28 阅读 7577

tuple是类型pair的模板。不同tuple类型的成员类型也不同,但一个tuple可以有任意数量的成员。每个确定的tuple类型的成员数目是固定的。

当我们希望将一些数据组合成单一对象,但有不想麻烦地定义一个新数据结构来表示时,tuple是非常有用的。(“快速而随意”的数据结构)

tuple类型及其伴随类型和函数都定义在tuple头文件中。

tuple t; t是一个tuple,成员数为n,第i个成员类型为ti。所有成员都进行值初始化。

tuple t(v1, v2, .vn); 此构造函数时explicit的。

make_tuple(v1, v2, .vn) 返回给定初始值初始化的tuple,并进行类型推断。

= !关系运算符。

get (t) 返回t的第i个数据成员的引用;如果t是一个左值,结果是一个左值引用;否则,是右值引用。tuple的所有成员都是public的,i是一个整型常量。

tuple_size::value 一个类模板,可以通过一个tuple类型类初始化。它有一个名为value的public constexpr static 数据成员,类型为size_t,表示给定tuple类型中成员的数量。

teple_element::type 一个类模板,可以通过一个整型常量和一个tuple类型来初始化。它有一个名为type的public成员,表示给定tuple类型中指定成员的类型。

如果不知道一个tuple的准确的类型细节,可以用两个辅助类模板来查询tuple的成员的数量和类型:

typedef decltype(item) trans;

size_t sz = tuple_size::value;

tuple_element<1, trans> :type cnt = get<1>(item);

为了使用关系运算符,对没对成员使用《必须都是合法的。

由于tuple定义了《和==运算符, 我们可以将tuple序列传递给算法,并且可以再无心容器中将tuple作为关键字类型。

tuple常用的以个用途是从一个函数返回多个值。

/matches有三个成员:一家书店的索引和两个指向书店vector中元素的迭代器。

typedef tuple::size_type, vector::const_iterator, vector::cosnt_iterator> matches;

vector findbook(const vector> &files, const string &book)

vector ret;

for(auto it = it !=files,cend( )it)

return ret;

void reportresults(istream &in, ostream &os, const vector> &files)

string s;

while( in>> s)

for (const tuto & stre : trans)

os <(store)

<< accumulate(get<1>(store>, get<2>(store), sales_data(s))

标准库还定义了bitset类, 使得为运算的使用更为容易, 并且能够处理超级最长整型类型大小的位集合。bitset类定义在头文件bitset中。

类似于数组。变化从0开始的二进制位被称为低位,左后结束的二进制位被称为高位。

bitset b; b有n为;每一位均为0. 此构造函数时一个constexpr

bitset b(u); b是unsigned long long值u的低n为的拷贝。如果n大于unsigned long long的大小,则b中超出unsigned long long的高位被设置为0 。此构造函数时以个constexpr。

初始值中多出的高位被丢弃。

bitset b(s, pos, m, zero, one); 是string s从位置pos开始m个字符的拷贝。s只能包含字符zero和one;如果s包含任何其他字符,构造函数抛出invalid_argument 异常。字符在b中分别保存为zero和one。

pos默认为0, m默认为string::npos, zero默认为'0' ,one默认为 '1'

bitset b(cp, pos, m, zero, one); 与一个构造函数相同, 但从cp指向的字符数组中拷贝字符。如果未提供m,则cp必须指向一个c风格字符串串。如果提供了m,则从cp开始必须至少有m个zero或one字符。

注意:接受一个string或一个字符指针的构造函数时explicit的。在新标准中增加了为0和1指定其他字符的功能。

对于string的下标编号习惯与bitset加好相反:string中下标最大的字符(最右字符)用来初始化bitset中的低位(下标为0的二进制位)。当你用一个string初始化一个bitset时,要记住这个差别。

bitset还支持位运算符。这些运算符用于bitset对象的含义与内置运算符用于unsigned运算对象相同。

) b中时否存在置位(即等于1)的二进制位。

) b中所有的位都置位了吗。

) b中不存在置位的二进制位吗。

) b中置位的位数。

) 一个constexper函数,返回b中的位数。

若pos位置的是位置的,则返回true,否则返回false

v) 将位置pos处的位设置为bool值v。v默认为true。如果未传递实参,则将b中所有位置位。

将pos处的位复位或将b中所有位复位。

改变位置pos处的位的状态或改变b中每一位的状态。

b[pos] 访问b中位置pos处的位;如果b是const,则当该位置位是b[pos]返回一个bool值true,否则返回false;非const版本返回bitset定义的一个特殊类型,它允许我们曹总指定位的值。

) 返回一个unsigned long或一个unsigned long long值,其位模式雨b相同。如果b中位模式不能放入指定的结果类型,则抛出一个overflow_error异常。

one) 返回一个string,表示b中的位模式。zero和one的默认分别是,用来表示b中的

os>b 从is读取字符存入b。当下一个字符不是1或0是,或是已经读入 )个位时,读取过程停止。

正则表达式是一种描述字符列的方法,是一种极其强大的技术工具。re库定义在头文件regex中,它包含多个组件:

regex 表示有一个正则表达式的类。

regex_match 将一个字符序列与一个正则表达式匹配,如果输入序列与表达式匹配则regex_match函数返回true

regex_search 寻找第一个与正则表达式匹配的子序列如果输入序列中一个子串与表达式匹配,则regex_search 函数返回true

regex_replace 使用给定格式替换一个正则表达式。

sregex_iterator 迭代器适配器,调用regex_search来遍历一个string中所匹配的字串。

smatch 容器类,保存在string中搜索的结果。

ssub_match string中匹配的子表达式的结果。

regex、search 和regex_match的参数:

注:这些操作返回bool值,指出是否找到匹配。

seq, m, r, mftseq, r, mft)

在字符seq中查找regex对象r中的正则表达式。seq可以是一个string、表示范围的一对迭代器以及一个指向空字符结尾的字符数组的指针。

C11学习笔记 5

参数传递时,如果是引用类型,它将绑定到对应的实参上,否者,将实参的值拷贝后赋给形参。引用可避免拷贝,如果不需要改变参数,最好定义成常量引用。和其他初始化一样,当用实参初始化时会忽略顶层const,当形参有顶层const时,传给它常量对象或非常量对象都可以。我们可以用非常量初始化一个底层const对象...

C 11学习笔记 11

动态分配的内存,只有在显式释放是,这些对象才会销毁。但是标准库中的两智能指针可以确保自动释放。除了静态内存和栈内存,每个程序还拥有一个内存池。这部分内存被称作自由空间或堆。静态内存用来保存局部static对象 类static数据成员以及定义在任何函数之外的变量。栈内存用来保存定义在函数没得非stat...

C 11学习笔记 15

面向对象编程和泛型编程都能处理在编写程序时不知道类型的情况。不同之处 oop能处理类型在程序运行之前都未知的情况 而泛型编程中,在编译时就能获知类型了。模板参数类别不能为空。模板参数表示在类或函数定义中用到的类型或值。template int compare const t v1 const t v...