1 using类型别名
- 新别名紧跟using关键字,可读,容易对齐
using value_type=T;
using reference=value_type&;
using const_reference=const value_type&;
- 生成别名模板(typede不支持这样的功能)
template<typename T>
using remove_cv_t=typename remove_cv<T>::type;
定宽整数类型
- int8_t INT8_MAX
- int16_t INT16_MAX
- int32_t INT32_MAX
- int64_t INT64_MAX
- uint8_t UINT8_MAX
- uint16_t UINT16_MAX
- uintptr_t UINTPTR_MAX
- uintmax_t UINTMAX_MAX
3 enum class
- 更强的类型,跟整数没有任何隐式转换
- 独立的作用域,更不容易和其他名字发生冲突
enum class Color:unit8_t{red,green=20,blue};
Color r=Color::blue;
Switch(r){
case Color::red:cout<<"red\n";break;
case Color::green:cout<<"green\n";break;
case Color::blue:cout<<"blue\n";break;
}
int n=r;//错误:不存在从有作用域枚举到int的隐式转换
int n=static_cast<int>(r);//ok,n=21
4 std::byte
- 定义为:enum class byte:unsigned char{};
- 支持移位、按位或等比特操作
- 跟整数类型之间需要显示进行转换,对容器初始化不方便,需要写成{std::byte{0},std::byte{1},...}
- 不会像unit8_t一样会误作字符输出到终端,需要显式确定使用那种方法输出,可以强制转换成int来显示字节内容,也可以强制转换成unsigned char 来作为字节内容写入文件,提供to_integer函数模板来进行安全转换(C++17)
5 C++的字符类型
- char:单字节字符或者传统编码字符(C++20前也用来表示UTF-8),字符串字面量:"hi"
- wchar_t:宽字符(但宽度不确定),字符串字面量:L"hi"
- char16_t:UTF-16(C++11),字符串字面量:u"hi \u6C49\U0001F600"
- char32_t:UTF-32(C++11),字符串字面量:U"hi \u6C49\U0001F600"
- char8_t:UTF-8(C++20),字符串字面量:u8"hi \u6C49\U0001F600"
6 tuple
- 多元组 固定大小,包含一组异质数据
- pair的推广
- get:获取元素
- tuple_size_v:获取tuple的大小
- tuple_cat:拼接多个tuple
using my_tuple=tuple<int,string,string>
vector<my_tuple> vn{{1,"one","un"},
{2,"two","un"},
{3,"three","un"}};
get<2>(vn[0])="une";//访问第一组第三个位置
7 tie
- 把变量绑定成为引用的tuple
- 可以通过tuple的幅值一次对多个变量赋值
- 可以使用std::ignore来忽视某个位置上的变量
#include<tuple>
#include<iostream>
#include<vector>
using my_tuple=tuple<int,string,string>
my_tuple two{2,"two","duex"};
int num;
string french;
tie(num,std::ignore,fench)=two;
cout<<french<<endl;//等到deux
7.1tie和快速比较
- tuple本身支持比较操作,从前到后逐项比较
- 使用tie可以快速写出比较函数
strcut PersonInfo{
string name;
string id_num;
int birth_year;
};
bool operator<(const PersonInfo&lhs,const PersonInfo&rhs)
{
return tie(lhs.name,lhs.id_num)<tie(rhs.name,rhs.id_num);
}
8 结构化绑定(C++17)
multimap<stirng,int>::iterator lower,upper;
std::tie(lower,upper)=mmp.equal_range("four");
auto[lower,upper]=mmp.equal_range("four");//结构化绑定
9 时间(chrono)
9.1时钟(clock)
- 标准库提供了三种不同的时钟
- 时钟可以产生时间点
9.2时间点(time_point)
本质上从某一时间点开始的时长
9.3时长(duration)
利用比例的概念的灵活机制
10 随机数(random)
- 非常灵活而又强大的随机数库
- 提供对接真正系统随机数的机制
- 提供多种不同的伪随机数产生器
- 提供产生特定分布的工具
11 正则表达式(regex)
- 支持匹配、搜索和替换