argparse 库函数
argparse 是现代 C++ 程序参数解析库。该库是 header-only 的,使用该库需要使用 C++ 17。
argparse 支持位置参数,可选参数
位置参数语法支持:
_empty_: 参数命令为空
'-': 参数命令为 -
'-' decimal-literal: 参数命令为 - 加数字
!'-' anything: 不带前缀 - 的任何命令
ArgumentParse 类constructorenum class default_arguments : unsigned int { none = 0, help = 1, version = 2, all = help | version,};explicit ArgumentParser(std::string program_name = {}, std::string version = "1.0", d ...
std::locale 学习笔记
说明std::locale 类对象是一个包含一系列不可变 facets 的索引。c++ 库中的每个输入输出流对象都关联一个 std::locale 对象。通过使用该 locale 中的 facets 来解析和格式化数据。
同时 std::basic_regex 对象也和一个 std::locale 对象关联。
通常 locale 中定义了一些标准的 facets。也可以自己定义 locale。
支持的标准 facets 如下:
char type
wchar_t type
std::collate<char>
std::collate<wchar_t>
std::ctype<char>
std::ctype<wchar_t>
std::codecvt<char, char, mbstate_t>
std::codecvt<char32_t, char, mbstate_t>
std::codecvt<char16_t,char,mbstate_t>
std::codecvt& ...
std::ios 等学习笔记
std::ios_baseios_base 类是一个多用途类,用作所有 I/O 流类的基类。它维护着几种数据:
状态信息:流状态标志
控制信息:控制输入和输出序列的格式以及语言环境的标志
私有存储:可扩展索引数据结构,允许 long 和 void* 成员,它可以实现为两个任意长度的数组或两个元素结构的单个数组或另一个容器
回调函数:从 imbue()、std::basic_ios::copyfmt() 和 ~ios_base() 调用的任意数量的用户定义函数
成员变量openmode流打开的模式类型,包括以下常量值
app: 在每次写入之前移到流的末尾(追加模式)
binary: 以二进制方式打开
in: 以读取的方式打开
out: 以写入的方式打开
trunc: 打开时丢弃流的内容
ate: 打开后立即移到流的末尾
MSVC 中定义如下:
enum _Openmode { // constants for file opening options _Openmask = 0xff};static constexpr _Openmode in ...
std::weak_ptr 学习笔记
使用 shared_ptr 可能会导致循环引用的问题。weak_ptr 能够解决循环引用的问题。
weak_ptr 能够访问 shared_ptr 的底层对象,但不会增加该对象的引用计数。
可以通过 weak_ptr 创建一个 shared_ptr,来保持 shared_ptr 底层对象的生命周期,从而防止 weak_ptr 在使用时,对象被释放掉。
Example
使用 weak_ptr 解决循环引用问题
#include <iostream>#include <memory>#include <string>#include <vector>#include <algorithm>using namespace std;class Controller{public: int Num; wstring Status; vector<weak_ptr<Controller>> others; explicit Controller(int i) : Num(i), Sta ...
std::shared_ptr 学习笔记
shared_ptr 是多个属主指向同一个对象的智能指针。shared_ptr 可以被拷贝,也可以通过值传递的方式作为参数传递给函数。
shared_ptr 通过引用计数来维护对象的生命周期,当新添加指向该对象的智能指针时,引用计数加 1,当有一个指向该对象的智能指针析构时,引用计数减 1。当引用计数变为 0 时,对象内存会被释放掉。
创建 shared_ptr 可以使用帮助函数 make_shared 来创建。
Examples
依赖的代码
// shared_ptr-examples.cpp// The following examples assume these declarations:#include <algorithm>#include <iostream>#include <memory>#include <string>#include <vector>struct MediaAsset{ virtual ~MediaAsset() = default; // make it poly ...
std::unique_ptr 学习笔记
unique_ptr 是不共享的智能指针。其不能被拷贝,不能通过传值的方式作为参数传递给函数,也不能用于 STL 中需要 copy 的算法中。
unique_ptr 能被 move。当 unique_ptr 被 move 时,unique_ptr 中内存资源的属主会被转移。
比较推荐的做法是一个对象有一个属主,因为一个对象有多个属主时会增加程序逻辑的复杂性,例如多线程时会有竞争。
右边的图例举了一个属主转移的例子;刚开始对象的属主是 ptrA,当执行 move 后,对象属主变为了 ptrB。
unique_ptr 定义在 <memory> 头文件中。其效率和原始指针差不多,也支持 * 和 → 运算符。
构造 unique_ptr 时,可以使用帮助函数 make_unique 。例如:
auto ptrA = make_unique<int>(10);
Examples
如何创建 unique_ptr 实例
unique_ptr<Song> SongFactory(const std::wstring& artist, const std ...
std::list 学习笔记
list 是类模板,其声明如下
template <class T, class Allocator = std::allocator<T>>class list;
std::list 是一个容器,它支持从容器中的任何位置进行常数时间的插入和删除元素。不支持快速随机访问。它通常被实现为一个双向链表。与 std::forward_list 相比,此容器提供双向迭代能力,但空间效率较低。
creatorconstructor
默认构造函数,使用默认构造的分配器构造一个空容器
使用给定的分配器 alloc 构造一个空容器
构造一个具有 count 个元素的 list,并使用类型的默认值进行初始化
构造一个具有 count 个元素的 list,并初始化每个元素为 value
构造一个具有 count 个元素的 list,并使用类型的默认值进行初始化,不进行拷贝,原地创建对象
通过 range [first, last) 进行初始化
拷贝构造
移动构造
通过初始化列表进行初始化
#include <iostream>#include <list> ...
vscode 添加 VS2019 的命令行 Terminal
File -> Preference -> Settings -> Extensions -> Scroll down and find “Edit in settings.json”
然后在最后添加以下内容
"terminal.integrated.profiles.windows": { "VS2019": { "path": "cmd.exe", "args": ["/k", "C:\\Program Files (x86)\\Microsoft Visual Studio\\2019\\Community\\Common7\\Tools\\VsDevCmd.bat"] } },"terminal.integrated.automationShell.windows": null,"terminal. ...
std::vector 学习笔记
vector 是类模板,其声明如下
template<class T, class Allocator = std::allocator<T>>class vector;
creatorconstructor
默认初始化,构造一个空的容器
构造一个具有 count 个元素的 vector,并使用类型的默认值进行初始化
构造一个具有 count 个元素的 vector,并初始化每个元素为 value
通过 range [first, last) 进行初始化
拷贝构造
移动构造
通过初始化列表进行初始化
#include <iostream>#include <vector>int main(){ // 默认初始化,构造一个空的容器 std::vector<int> vec; // 构造一个具有 10 个元素的 vector,并使用类型的默认值进行初始化 std::vector<int> vec1(10); // 构造一个具有 10 个元素的 vector,并初始化每个元素为 ...
Visual Studio 对当前项目设置代码风格
Visual Studio 在写 C++ 代码时能够自己对代码进行格式化,同时我们也可以手动进行格式化,快捷键 Ctrl + k,Ctrl + D 对文档进行格式化,快捷键 Ctrl + K,Ctrl + F 对选中的文本进行格式化。
默认情况下,Visual Studio 会在后台运行 clangformat.exe,并在你输入代码时应用格式。手动格式化也就是手动调用 clangformat.exe。
在 Visual Studio 中,默认的代码风格有 LLVM, Google, Chromium, Mozilla, WebKit,我们也可以通过配置 .clang-format 或者 _clang-format 文件来配置项目的代码风格。如果项目文件夹中存在此类文件,Visual Studio 将使用它来格式化该文件夹及其子文件夹中的所有源代码文件。
对于谷歌风格的配置文件可以简单配置为
# Run manually to reformat a file:# clang-format -i --style=file <file>Language: CppBasedOnS ...