在 C++11 中引入了 std::tuple 类模板,它是一个通用的元组(Tuple)类,用于存储多个不同类型的值。std::tuple 可以看作是一个固定大小的、类型安全的、不可修改的集合。
使用 std::tuple 可以方便地组合多个值,而无需定义新的结构体或类。下面是一个简单的示例:
123456789101112131415161718#include <iostream>#include <tuple>int main() { // 创建一个包含 int、double 和字符串的 tuple std::tuple<int, double, std::string> myTuple(42, 3.14, "Hello"); // 使用 std::get 访问 tuple 中的元素(通过索引) int intValue = std::get<0>(myTuple); double doubleValue = std::get<1>(myTuple); s ...
C++11 引入了 Lambda 表达式,Lambda 表达式是一种匿名函数,可以在需要函数的地方定义并使用它,而无需显式命名函数。
Lambda 表达式的基本语法如下:
123[capture list](parameters) -> return_type { // 函数体}
其中,capture list 指定要捕获的变量列表(即Lambda表达式中可访问的外部变量),parameters 是Lambda函数的参数列表,return_type 是返回类型(可以使用 auto 自动推导),函数体 则是实现具体功能的代码块。
123456789101112131415//简单实例#include <iostream>int main() { int x = 42; // 使用 Lambda 表达式打印变量 x 的值 auto printX = [x]() { std::cout << "x = " << x << std::endl; ...
右值引用C++ 中的右值引用(Rvalue reference)是一种引用类型,它用于绑定到临时对象或将要被移动的对象(右值)。通过右值引用,我们可以对右值进行有效的操作,如移动语义和完美转发。
右值引用的语法是在类型后面加上 &&,例如 int&& 表示一个右值引用到 int 类型的对象。右值引用只能绑定到右值,不能绑定到左值。
右值引用主要有两个重要的应用场景:移动语义和完美转发。
移动语义: 右值引用使得我们可以实现高效的资源管理,尤其是在处理动态分配的内存或大型对象时。通过移动语义,我们可以将资源从一个对象转移到另一个对象,避免了不必要的拷贝开销。通过定义移动构造函数和移动赋值运算符,并使用右值引用参数,可以实现对资源的高效转移。移动构造函数用于在构造对象时从临时或将要被销毁的对象中“窃取”资源,移动赋值运算符用于在对象已存在时将资源从右值赋值给对象。这样,在资源转移完成后,原始对象就不再拥有该资源,而新对象拥有该资源,避免了多余的内存分配和拷贝操作。
完美转发: 完美转发是指在函数模板中保持参数的值类别(左值或右值)并将其转发到其他函数,以实 ...
explicitexplicit专用于修饰构造函数,表示只能显式构造,不可以被隐式转换,根据代码看explicit的作用:
1234567891011struct A { explicit A(int value) { cout << "value" << endl; }};int main() { A a = 1; // error,不可以隐式转换 A aa(2); // ok return 0;}
final&overridec++11关于继承新增了两个关键字,final用于修饰一个类,表示禁止该类进一步派生和虚函数的进一步重载,override用于修饰派生类中的成员函数,标明该函数重写了基类函数,如果一个函数声明了override但父类却没有这个虚函数,编译报错,使用override关键字可以避免开发者在重写基类函数时无意产生的错误。
123456789101112131415struct Base { vir ...
nullptrnullptr是c++11用来表示空指针新引入的常量值,在c++中如果表示空指针语义时建议使用nullptr而不要使用NULL,因为NULL本质上是个int型的0,其实不是个指针。举例:
12345678910111213void func(void *ptr) { cout << "func ptr" << endl;}void func(int i) { cout << "func i" << endl;}int main() { func(NULL); // 编译失败,会产生二义性 func(nullptr); // 输出func ptr return 0;}
constexprconstexpr 关键字的功能是使指定的常量表达式获得在程序编译阶段计算出结果的能力,而不必等到程序运行阶段。C++ 11 标准中,constexpr 可用于修饰普通变量、函数(包括模板函数)以及类的构造函数。
常 ...
C++11 引入了统一初始化(Uniform Initialization)语法,这使得对象的初始化更加一致和简洁。使用统一初始化,可以通过多种方式来初始化对象,无论是基本类型、类类型还是数组都可以使用相同的语法。
在 C++11 中,统一初始化有以下几种形式:
123456789int x = 42; // 直接初始化一个整数std::string s("Hello"); // 直接初始化一个字符串对象int y = x; // 使用拷贝初始化将 x 的值赋给 ystd::vector<int> v = {1, 2, 3}; // 使用拷贝初始化进行向量初始化int z{123}; // 使用列表初始化一个整数std::vector<int> nums{1, 2, 3}; // 使用列表初始化初始化一个向量std::pair<int, double> p{42, 3.14}; // 使用列表初始化初始化一个键值对
智能指针在c++03的时候就被引入了,就是auto_ptr,但是因为原始指针所有权问题,auto_ptr被废弃掉了,取而代之的是c++11引入的智能指针——shared_ptr / weak_ptr / unique_ptr,在c++11新特性中,智能指针应该是我使用频率最高的内容,合理的使用智能指针,可以有效的帮我们管理好对象的生命周期,不再被内存泄漏的问题所困扰。
简介需要引用头文件memory
shared_ptr他是一个强指针,只要任何一个shared_ptr没有释放,那么原始指针就不会被释放,即每个shared_ptr都会影响着原始指针的生命周期
例子:
123456789101112131415161718192021222324252627282930313233struct Item{ int val = 1234; Item() { std::cout << "Item constructor" << std::endl; } ~Item() & ...
Includeinclude指令应符合标准格式#include 后只应为 < 头文件路径 > 或 “ 头文件路径 “,否则会导致标准未定义的行为。
示例:
1234567#include <string.h> // Compliant#include "string.h" // Compliant #define HEADER "string.h"#include HEADER // Compliant#include stdlib.h // Non-compliant, undefined behavior
例中对 string.h 的引用符合标准,而对 stdlib.h 的引用会导致标准未定义的行为。
注意,由引号标识的头文件路径并非字符串常量,不应对其使用字符串常量的特性,如:
1#include "stdlib" ".h" // Non-compliant, implementati ...
题目矩形蛋糕的高度为 h 且宽度为 w,给你两个整数数组 horizontalCuts 和 verticalCuts,其中:
horizontalCuts[i] 是从矩形蛋糕顶部到第 i 个水平切口的距离
verticalCuts[j] 是从矩形蛋糕的左侧到第 j 个竖直切口的距离
请你按数组 horizontalCuts 和 verticalCuts 中提供的水平和竖直位置切割后,请你找出 面积最大 的那份蛋糕,并返回其 面积 。由于答案可能是一个很大的数字,因此需要将结果 对 109 + 7 取余 后返回。
示例 1:
123输入:h = 5, w = 4, horizontalCuts = [1,2,4], verticalCuts = [1,3]输出:4 解释:上图所示的矩阵蛋糕中,红色线表示水平和竖直方向上的切口。切割蛋糕后,绿色的那份蛋糕面积最大。
示例 2:
123输入:h = 5, w = 4, horizontalCuts = [3,1], verticalCuts = [1]输出:6解释:上图所示的矩阵蛋糕中,红色线表示水平和竖直方向上的切口。切割蛋糕后,绿 ...
R2.1 不可失去对已分配资源的控制对于动态分配的资源,其地址、句柄或描述符等标志性信息不可被遗失,否则资源无法被访问也无法被回收,这种问题称为“资源泄漏”,会导致资源耗尽或死锁等问题,使程序无法正常运行。
在资源被回收之前,记录其标志性信息的变量如果:
均被重新赋值
生命周期均已结束
所在线程均被终止
相关资源便失去了控制,无法再通过正常手段访问相关资源。
示例:
12345int fd;fd = open("a", O_RDONLY); // Open a file descriptorread(fd, buf1, 100);fd = open("b", O_RDONLY); // Non-compliant, the previous descriptor is lostread(fd, buf2, 100);
例中变量 fd 记录文件资源描述符,在回收资源之前对其重新赋值会导致资源泄漏。
R2.2 不可失去对已分配内存的控制动态分配的内存地址不可被遗失,否则相关内存无法被访问也无法被回收,这种问 ...