标准库tuple类模板
tuple是类似pair的模板。
每个pair的成员类型都不相同,但每个pair都恰好有两个成员。
不同tuple类型的成员类型也不相同,但是一个tuple可以有任意数量的成员。
每个确定的tuple类型的成员数目是固定的,但一个tuple类型的成员数目可以与另一个tuple类型不同。
tuyple<T1,T2,...,Tn> t; | t是一个tuple,第i个成员的类型为Ti.所有成员都进行值初始化。 |
tuple<T1,T2,...,Tn> t(v1,v2,...,vn); | 每个成员用对于的vi来初始化,此构造函数是显示的。 |
make_tuple(v1,v2,...,vn) | 返回一个用给定初始值初始化的tuple,tuple的类型由初始值的类型判断 |
t1 == t2 | 当两个具有相同数量的成员且成员对应相等时,两个tuple相等。一旦发现有不相等的,剩下的成员就不会再比较了。 |
t1 != t2 | |
t1 relop t2 | 关系运算符使用字典序 |
get(t) | 返回t的第i个数据成员的引用;如果t是一个左值,结果是一个左值引用;否则,是一个右值引用。tuple所有成员都是public的。 |
tuple_size |
一个类模板,可以通过一个tuple类型来初始化。它有一个名为value的public constexpr static数据成员,类型为size_t,表示给定tuple类型中成员的数量 |
tuple-element<i,tupleType>::type | 一个类模板,可以通过一个整型常量和一个tuple类型来初始化。它有一个叫type的public成员,表示给定tuple类型中指定成员的类型。 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
//定义和初始化 tuple<size_t,size_t,size_t> threeD;//三个成员都设置为0 tuple<string,vector<double>,int,list<int>> someVal("construct",{3.23,2.455},3,{0,1,2,3,4,5}); tuple<size_t,size_t,size_t> threeD = {1,2,3};//错误 tuple<size_t,size_t,size_t> threeD(1,2,3);//正确 //make_tuple auto item = make_tuple("0-000-2222-333",3,23.444); //访问成员 auto book = get<0>(item); auto ant = get<1>(item); auto price = get<2>(item); |
bitset运算
bitset类是一个类模板
bitset操作定义了多种检测或设置一个或多个二进制位的方法。
bitset还支持位运算符。
这些位运算符用于bitset对象的含义与内置运算符用于unsigned运算对象的含义相同。
b.any() | b中是否存在置位的二进制位 |
b.all() | b中所有位都置位了吗 |
b.none() | b中不存在置位的二进制位吗 |
b.count() | b中置位的位数 |
b.size() | y一个constexpr函数,返回b中的位数 |
b.best(pos) | r若pos位置的位是置位的,则返回true,否则返回false |
b.set(pos,v) | 将位置pos位的位设置bool值,v默认位true,如果未传递实参,则将b中所有位置位 |
b.set() | |
b.reset(pos) | 将位置pos位处的位复位或将b中所有位复位。 |
b.reset() | |
b.filp(pos) | 改变pos处的位的状态或改变b中的每一位的状态 |
b[pos] | 访问b中位置pos处的位;如果b是const的,则当该位置位时b[pos]返回一个bool值true,否则返回false |
b.to_ulong() | 返回无符号long |
b.to_ullong() | 返回无符号long long |
b.to_string(zero,one) | 返回一个string,表示b中的位模式,zero和one的默认值分别为0和1,用来表示b中的0和1 |
os << b | 将b中二进制位打印为字符0或1,打印到流os |
is >> b | 从is读取字符存入b。当下一个字符不是0或1时,或是已经读入b.size()个位时,读取过程停止 |
1 2 |
bitset<32> bitvec(iU);//32位,低位为1,其余位为0 bool is_set = bitvec.any();//true,因为有1位置位 |
bitset对象的一个或多个位置位(即等于1)时,操作any返回true。
C++11标准引入了all操作,当所有位置位时返回true。
正则表达式
正则表达式是一种描述字符序列的方法,是一种极其强大的计算工具。
这个地方,仅仅简单介绍C++正则表达式库(RE库)的一些内容,它是C++11标准库的一部分。
RE库定义在regex文件中
regex | 表示有一个正则表达式的类 |
regex_match | 将一个字符序列与一个正则表达式匹配 |
regex_search | 寻找第一个与正则表达式匹配的子序列 |
regex_replace | 使用给定格式替换一个正则表达式 |
sregex_iterator | 迭代器适配器,调用regex_search来遍历一个string中所有匹配的子串 |
smatch | 容器类,保存在string中搜索的结果 |
ssub_match | string中匹配的子表达式的结果 |
1 2 3 |
string pattern("[^c]ei"); pattern = "[[:alpha:]]*" + pattern + "[[:alpha:]]*"; regex r(pattern); |
随机数库
程序通常需要一个随机数源。在C++11标准之前,C和C++都是依赖于一个简单的C库函数rand来生成随机数。
这个rand函数生成均匀分布的伪随机数,每个随机数的范围在0和一个系统相关的最大值(至少为32767)之间。
rand函数有一些问题:即使不是大多数,也有一些程序需要不同范围内的随机数。一些应用需要随机浮点数。一些程序需要非均匀分布的数。而程序员为了解决这些问题,试图转换rand函数输出的随机数的范围、类型和分布时,存储会引入非随机性。
定义在random中的随机数库通过一组协作的类来解决这些问题:随机数引擎类,随机数分布类。
引擎 | 类型,生成随机unsigned整数序列 |
分布 | 类型,使用引擎返回服从特定概率分布的随机数 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
default_random_engine e;//生成随机无符号数 //分布类型与引擎 uniform_int_distribution<unsigned> u(0,9); default_random_engine e1; for(size_t i = 0;i < 10; ++i) { cout << u(e1) << " ";//生成10个0到9之内的整数//均匀分布 } default_random_engine e2; uniform_real_distribution<double> u(0,1); for(size_t i = 0;i < 10; ++i) { cout << u(e2) << " ";//生成10个0到1之内的实数//均匀分布 } default_random_engine e3; normal_sidtribution<> n(4,1.5);//均值4,标准差1.5 vector<unsigned> vals(9); for(size_t i = 0;i != 100; ++i) { unsigned v = lround(n(e3));//舍入到最接近的整数 if(v < vals.size()) ++vals[v]; } |
格式控制
boolalpha | 将true和false输出为字符串 |
*noboolalpha | 将true和false输出为1,0 |
showbase | 对整型值输出表示进制的前缀 |
*noshowbase | 不生成表示进制的前缀 |
showpoint | 对浮点数总是显示小数点 |
*noshowpoint | 只有当浮点数包含小数部分时才显示小数点 |
showpos | 对非负数显示+ |
*noshowpos | 对非负数不显示+ |
uppercase | 在十六进制中打印0X,在科学计数中打印E |
*noupercase | 在十六进制中打印0x,在科学计数中打印e |
*dec | 整型数显示为十进制 |
hex | 整型数显示为十六进制 |
oct | 整型数显示为八进制 |
left | 在值的右侧添加填充字符 |
right | 在值的左侧添加填充字符 |
internal | 在符号和值之间添加填充字符 |
fixed | 浮点数显示为定点十进制 |
scientific | 浮点数显示为科学计数法 |
hexfloat | 浮点数显示为十六进制(C++11标准) |
defaultfloat | 重置浮点数格式为十进制(C++11标准) |
unitbuf | 每次输出操作后都刷新缓冲区 |
*nounitbuf | 恢复正常的缓冲区刷新方式 |
*skipws | 输入运算符跳过空白符 |
noskipws | 输入运算符不跳过空白符 |
flush | 刷新ostream缓冲区 |
ends | 插入空字符,然后刷新ostram缓冲区 |
endl | 插入换行,然后刷新ostream缓冲区 |
*表示默认流状态 |
内联命名空间
C++11标准引入了一种新的嵌套命名空间,叫内联命名空间。
和普通的嵌套命名空间不同的是,内联命名空间中的名字可以被外层命名空间直接使用。
也就是说,我们无效在内联命名空间的名字前面添加表示该命名空间的前缀,通过外层命名空间的名字就可以直接访问它。
1 2 3 4 5 6 7 8 |
inline namespace FifthEd { //... } namespace FifthEd//隐式内联 { calss aet { } } |
继承的构造函数与多重继承
在C++11标准中,允许派生类从它的一个或几个基类中继承构造函数。
但是,如果从几个基类中继承了相同的构造函数,则程序将产生错误。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
struct base1 { base1() = default; base1(const string &); base1(shared_ptr<int>); }; struct base2 { base2() = default; base2(const string &); base2(int); }; //错误,d1试图从两个基类中继承d1::d1(const string &) struct d1:public base1,public base2 { using base1::base1; using base2::base2; }; struct d2:public base1,public base2 { using base1::base1; using base2::base2; //d2必须自定义一个接收string的构造函数 d2(const string & str):base1(str),base2(str) {} d2() = default;//一旦d2定义了自己的构造函数,必须出现这个 }; |
关于enum
C++包含两种枚举:限定作用域的不限定作用域的。
C++11标准引入了限定作用域的枚举类型。
定义限定作用域的枚举的格式如下:
1 |
enum class meiju {one,two,three}; |
定义不限定作用域的枚举的格式如下:
1 |
enum meiju {one,two,three}; |
另外,在C++11标准下,我们可以在枚举的名字后面加上冒号以及我们想在该enum中使用的类型。
1 2 3 4 5 6 |
enum intValues : unsigned long long { charTyp = 255,shortTyp = 65525,intTyp = 65535, longTyp = 4294967295UL, long_longTyp = 18446744073709551615ULL }; |
除此之外,在C++11标准中,我们可以提前声明enum。
enum的前置声明(无论显示还是隐式)都必须指定其成员的大小。
1 2 |
enum intValues :unsigned long long;//不限定作用域的,必须指定成员类型 enum class open_modes;//限定作用域的枚举类型可以使用默认成员类型int |
mem_fn
我们要使用function生成一个可调用对象
1 2 |
function<bool (const string&)> fcn = &string::empty; find_if(svec.begin(),svec.end(),fcn); |
使用mem_fn
mem_fn让编译器负责推断成员的类型。它可以从成员指针生成一个可调用对象;可function不同的是,mem_fn可以根据成员组织的类型推断可调用对象的类型。
1 |
find_if(svec.begin(),svec.end(),mem_fn(&string::empty)); |
类类型的union成员
早期的union不能含有定义了构造函数或拷贝控制成员的类类型成员。
C++11标准取消了这一限制。
然而对union来说,要想构造或者销毁类类型的成员必须执行非常复杂的操作,因为我们通常把含有内类型成员的union内嵌在另一个类中。这个类可以管理并控制与union的类类型成员有关的状态转换。
本文为原创文章,版权归Aet所有,欢迎分享本文,转载请保留出处!
你可能也喜欢
- ♥ C++_关于对象的具体初始化顺序11/30
- ♥ 51CTO:Linux C++网络编程一08/13
- ♥ C++标准模板库编程实战_算法和随机数12/08
- ♥ STL_内存处理工具05/02
- ♥ Effective C++_第一篇01/10
- ♥ C++_友元、联合体、内联、static、指针、深浅拷贝06/21