chrono 是 C++ 标准库中的一个命名空间,包含了一组用于处理时间和时间相关操作的类和函数头文件#include <chrono>基本组成Durations(时间段)用来表示一个时间段, duration类是一个模板类,它的模板定义如下template <class Rep, class Period = std::ratio<1>> class duration;Rep 为一种数值类型,duration用这个类型来表示 Period 的数量,比如int float doublePeriod 表示用秒表示时间单位的类型, ratio 这个类用来表示一个比例, 有两个参数,第一个为分zi,第二个为分母, 第二个默认值为 1, 比如 ratio<1, 1> 就代表一秒, ratio<60, 1> 就代表一分钟, ratio<1, 1000>代表一毫秒。常用的duration也可以使用预设好的如下,都是 预设好参数的 的 duration 类:第一个参数使用的long long, 所以表示的是整数。例如std::
用位来表示一个数,它是一种类似数组的结构,它的每一个元素只能是0或1,每个元素仅用1bit空间。头文件:#include<bitset>定义bitset<size> bs(initNum)其中 size 为 bitset 的容量,initNum 为初始值, 是转化为size长度二进制后赋给c的所有位, 还可以用01字符串来初始化,默认初始化为全0访问可以使用 [] 来访问,例如 bs[1] = 1; , 注意, 非0值会赋值成1, 0值赋值为0常用成员函数c.size() // 返回大小(位数) c.count() // 返回1的个数 c.any() // 返回是否有1 c.none() // 返回是否没有1 c.set() // 全都变成1 c.set(p) // 将第p + 1位变成1 c.set(p, x) // 将第p + 1位变成x c.reset() // 全都变成0 c.reset(p) // 将第p + 1位变成0 c.flip() // 全都取反 c.f
先看一个示例int main() { const int CONST_NUM = 10; int* p = const_cast<int*>(&CONST_NUM); *p = 20; cout << "CONST_NUM = " << CONST_NUM << endl; cout << "*p = " << *p << endl; } 在代码中我们是这样一个流程首先声明了一个局部常量 const int CONST_NUM = 10;然后通过 const_cast 去除了指向 CONST_NUM 的指针的常量属性 接着通过指针 p 对 CONST_NUM 进行了修改最后输出了 CONST_NUM 和 *p 的值我们来看一下输出结果CONST_NUM = 10 *p = 20 CONST_NUM 的 值居然和 *p 是不同的, 这是什么原因呢其实是c++ 存在 const 优化, 在 c 语言中没有
C++引入了四种更加安全的强制类型转换运算符,分别是const_cast、static_cast、reinterpret_cast和dynamic_cast,作用和区别如下:const_cast: 去除const(volatile)属性, 只针对指针、引用和this指针有效,其他情况会报错示例int main() { const int a = 0; // int *p = &a; // 这样会报错 int *p = const_cast<int*>(&a); // 去除了 const 属性 // int c = const_cast<int>(a); // 报错,因为只针对指针、引用和this指针有效 return 0; }static_cast:用于各种隐式转换例如void* 转换为任意类型的指针任意类型的指针转换为void*编译器允许的跨类型转换,比如char类型转换为int类型,double转int型static_cast 不做类型检查, 允许子类类型的指针安全转换为父类类型的指针,相反也能转换能成功但是不安全,结果未知,只能在拥有继承
现在我们有这样两个枚举的声明enum color0{ red, green, blue }; enum color1{ red, yellow, blue };这样的代码是会发生错误的,red 和 blue 发生了冲突,因为他们都可以在全局直接访问到,对于这种情况我们就可以使用带作用域的枚举值, 其实就是加了一个 class 关键字示例enum class color0{ red, green, blue }; enum class color1{ red, yellow, blue };这时候我们的代码就可以正常编译通过了,但是我们不可以在全局直接访问到枚举值了。如果想访问枚举值,要加作用域示例color0::red;总结带作用的枚举值是c++11中添加的新特性,它解决了不同枚举值之间重名的问题,也让代码的层次更为清晰,减少我们在编码过程中可能出现的错误。语法//声明 enum class 枚举名{ 枚举值... } // 访问 枚举名::枚举值;
! > 算术运算符 > 关系运算符 > && > || > 赋值运算符 > 逗号运算符
std::function简单而言就是一个函数包装器,一个通用函数类型头文件 #include <functional>用法:function<int(int, int)> 里面传入的是返回值 和参数列表示例#include <iostream> #include <functional> using namespace std; void vfun() { cout << "void fun()" << endl; } int ifun(int a) { cout << "int fun(int a)" << endl; return 0; } int main() { // Your code here function<void()> _vf = vfun; // 接收函数指针 function<int(int)> _if = ifun; f
1.最常见的using namespace std;这种方式会导入整个std命名空间,优点是方便快捷,缺点是可能导致命名冲突2.别名声明(Type Alias)using MyInt = int; MyInt myNumber = 42;这里,MyInt是int的别名,可以用来声明变量,相当于typedef int MyInt , 它相比于typedef 更加直观2.引入特定成员(Using Declaration)using MyNamespace::foo;例如using std::cout;这样就可以在不导入整个std命名空间的情况下使用cout
1.使用 \ 续行使用反斜杠\作为续行符(line continuation character)可以将一行代码分成多行书写,提高代码的可读性。反斜杠\用于表示续行,让一个较长的字符串字面值跨越多行书写。反斜杠\后面的换行符会被忽略,因此在编译时这些字符串字面值会被连接成一个单独的字符串。 string s = " This string will\n\ //最后的\代表续行 printed as the pyramid\n\ as one single string literal form\n"; 2.字符串连接相邻的字符串字面值会在编译时连接在一起。这个过程被称为字符串字面值的拼接(concatenation)。在你提供的代码中,三个字符串字面值被放在相邻的位置,因此它们会在编译时连接成一个单独的字符串。string s1 = "This string will be printed as the\n" //在编译阶段会将这几个字符串连接 &
lelele