STL 中 algorithm 使用——总介绍
Nonmodifying Sequence AlgorithmsSearch Algorithms
算法名称
算法说明
复杂度
adjacent_find()
Finds the first instance of two consecutive elements that are equal to each other or are equivalent to each other as specified by a predicate
O(N)
find(), find_if()
Finds the first element that matches a value or causes a predicate to return true
O(N)
find_first_of()
Like find, but searches for one of several elements at the same time
O(N*M)
find_if_not()
Finds the first element that causes a predicate t ...
操作符重载
以下表格为操作符重载推荐的使用方法
OPERATOR
NAME OR CATEGOTY
METHORD OR GLOBAL FUNCTION
WHEN TO OVERLOAD
SAMPLE PROTOTYPES
`operator+``operator-``operator*``operator/``operator%`
Binary arithmetic
Global function recommended
Whenever you want to provide these operations for your class
`T operator+(const T&, const T&);``T operator+(const T&, const E&);`
`operator-``operator+``operator~`
Unary arithmetic and bitwise operators
Method recommended
Whenever you want to provide these operations for your clas ...
C++ std::optional
说明std::optional 是一个类模板,其管理一个可选的包含值,也就是说值可以存在或者不存在。optional 的一个常见用例是可能失败的函数的返回值。与其他方法(例如 std::pair<T,bool>)相反, optional 可以很好地处理构建成本高的对象并且更具可读性,因为意图已明确表达。
optional<T> 的任何实例在某个时间点要么包含值,要么不包含值。如果 optional<T> 包含一个值,该值保证能够作为 optional<T> 的一部分进行分配,即永远不会发生动态内存分配。因此,即使定义了 operator*() 和 operator->(),可选对象也是创建对象,而不是指针。
当一个 optional<T> 类型的对象在上下文中转换为 bool 时,如果该对象包含一个值,则转换返回 true,如果它不包含一个值,则返回 false。
对象在下列情况下包含值:
对象是用 T 类型的值或另一个包含值的 optional 对象进行初始化/分配。
对象在下列情况下不包含值:
对象是默认初始化 ...
C++ 获取和设置当前路径
在 Windows 下,C++ 可以通过 Win API 或者标准库来获取和设置当前目录,接下来将分别对其进行说明。
通过 WIN API 获取和设置当前目录每个进程都有一个当前目录,它由两部分组成:
磁盘指示符,可以是驱动器号后跟冒号,或服务器名称后跟共享名 (\\servername\sharename)
磁盘指示符上的目录
多线程应用程序和共享库代码不应使用 GetCurrentDirectory 函数,并且应避免使用相对路径名。SetCurrentDirectory 函数写入的当前目录状态作为全局变量存储在每个进程中,因此,多线程应用程序无法可靠地使用此值,因为其他线程也可能正在读取或设置此值。此限制也适用于 SetCurrentDirectory 和 GetFullPathName 函数。
通过 WIN API 获取和设置当前目录的 API 如下
获取当前目录:GetCurrentDirectory
设置当前目录:setCurrentDirectory
GetCurrentDirectoryGetCurrentDirectory 的函数原型如下:
DWORD GetC ...
c++ 为什么需要将基类的析构函数指定为 virtual
说明对于基类继承类的构造函数和析构函数的执行顺序为:
构造函数
基类的构造函数
继承类的构造函数
析构函数
继承类的析构函数
基类的析构函数
为什么需要将基类的析构函数指定为 virtual 呢?
因为当用基类的指针指向一个继承类对象时,在 delete 基类指针时,如果不将析构函数指定为 virtual,则实际只有基类的析构函数会被调用,而继承类的析构函数不会被执行。所以当继承类中有资源需要在析构函数中释放时,会造成内存泄露等。
带有 virtual 的基类析构函数实例#include <iostream>class Something {public: Something() { std::cout << "2"; } virtual ~Something() { std::cout << "2"; }};class Base {public: Base() { std::cout <&l ...
Visual Studio 2019 快捷键
快捷键
描述
说明
Ctrl + G
转到行..
Ctrl + T
转到所有
Ctrl + Shift + T
转到文件
Ctrl + 1, Ctrl + R
转到最近的文件
Ctrl + 1, Ctrl + T
转到类型
Alt + \
转到成员
Ctrl + 1, Ctrl + S
转到符号
Alt + PgDn
转到文件中的下个问题
Alt + PgUp
转到文件中的上个问题
Ctrl + Shift + BackSpace
转到上一个编辑位置
Ctrl + F
快速查找
Ctrl + H
快速替换
Ctrl + Shift + F
在文件中查找
Ctrl + Shift + H
在文件中替换
Ctrl + Z
撤销
Ctrl + Y
重做
Ctrl + C
复制
Ctrl + V
粘贴
Ctrl + X
剪切
Ctrl + Shift + V
显示粘贴板历史记录
Ctrl + D
复制
Ctrl + K, Ctrl + D
设置文档格式
...
C++ 添加和移除 const 属性
C++ 可以通过 const_cast 添加和移除 const 属性,可以通过 std::as_const 返回一个 reference-to-const 变量,具体例子如下:
#include <iostream>#include <string>#include <format>#include <typeinfo>int main(){ const char* name_const{ "Tom" }; std::cout << std::format("type of name_const is: {}\n", typeid(name_const).name()); auto name_remove_const = const_cast<char*>(name_const); std::cout << std::format("type of name_remove_cons ...
C++20 designated initializers
说明C++20 引入了 designated initializers 来使用它们的名字来初始化聚合的数据成员。聚合类型可以是数组类型的对象,或者满足以下限制的结构体或类对象:
只有 public 数据成员
没有用户声明或继承的构造函数
没有虚函数
没有 virtual, private 或 protected 基类
例如,对于一个定义如下的员工结构体
struct Employee{ char firstInitial; char lastInitial; int employeeNumber; int salary { 75'000 };};
在定义一个结构体对象时,可以使用 uniform initialization 进行初始化,例如:
Employee anEmployee { 'J', 'D', 42, 80'000 };
也可以使用 designated initializers 进行初始化,例如:
Employee ...
C++ 获取函数名和变量名
C++ 中可以通过宏来获取函数的名称和变量的名称,__func__ 就是函数的名称。获取变量名称可以使用以下自定义宏
#define NAME(variable) (#variable)
例子:
#include <iostream>#define NAME(variable) (#variable)auto mysum(int a, int b){ std::cout << "function name: " << __func__ << std::endl; std::cout << NAME(a) << " + " << NAME(b) << " = " << (a + b) << std::endl; return a + b;}int main(){ auto s = mysum(5, 10); std::cout << typeid(s).nam ...
butterfly 主题使用记录
文章标头可用的字段
字段
说明
title
【必需】文章标题
date
【必需】文章创建日期
updated
【可选】文章更新日期
tags
【可选】文章标籤
categories
【可选】文章分类
keywords
【可选】文章关键字
description
【可选】文章描述
top_img
【可选】文章顶部图片
cover
【可选】文章缩略图(如果没有设置top_img,文章页顶部将显示缩略图,可设为false/图片地址/留空)
comments
【可选】显示文章评论模块(默认 true)
toc
【可选】显示文章TOC(默认为设置中toc的enable配置)
toc_number
【可选】显示toc_number(默认为设置中toc的number配置)
copyright
【可选】显示文章版权模块(默认为设置中post_copyright的enable配置)
copyright_author
【可选】文章版权模块的文章作者
copyright_author_href
【可选】文章版权模块的文章作者链接
co ...