密码学入门笔记
...
Cpp 结构化绑定 学习笔记
结构化绑定是C++17引入的一个重要的语法糖,可以让代码写得简洁不少,值得好好整理一下语法。 概述 结构化绑定(structured binding)是 C++17 标准引入的一项特性, 允许开发者在解包元组 (std::tuple)、std::pair、数组或自定义结构体等数据结构时, 将其中各个元素直接绑定到多个变量上,使得代码更加简洁易读。 基本用法 最基本的语法形如 1auto [a0,a1,a2] = data; 这一行语句可以对data进行结构化绑定,要求: 左侧必须使用auto开头(其实还可以加上const,&等修饰,这里暂不讨论,见下文) 左侧具体需要的变量个数由右侧数据决定。 a0等是合法的C++标识符,并且不能是已经定义过的标识符 结构化绑定过程中会自动用a0等作为标识符定义变量,将其依次对应data中的元素值。 假设data是一个具有三个元素的自定义结构体 12345struct Person { std::string name; int age; double...
Cpp std::tuple 学习笔记
关于C++元组 std::tuple 的整理笔记。 概述 std::tuple是一个非常重要的C++标准库模块,它是一个固定大小且类型安全的数据容器, 提供了一种将任意数量的不同类型元素有序地打包组合在一起的方式, 在某些原本需要临时定义结构体的场合可以用std::tuple替代,使得代码更加简洁。 std::tuple的最大特点是编译期运算,与元组相关的标准库函数的实现属于模板元编程的范畴。在模板元编程中,元组也是一个重要角色,因为元组在编译期既含有整数信息也含有类型信息。 事实上从C++11开始,标准库的<tuple>就提供了std::tuple,但是语法既繁琐又简陋,一些直观的语法是不支持的。 在后续的标准中对std::tuple的支持在不断完善,用法变得更加简洁。 在本文中主要涉及的是C++20标准支持的用法,部分语法在C++11标准下是编译不过的。 简单示例 下面提供一个基于std::tuple实现具有多个返回值的函数示例 12345678910111213141516171819202122#include <format>#include...
Cpp std::format 学习笔记
已经2024年了,C++20标准正式收编fmtlib得到的格式化方案std::format已经被三大编译器支持得很好了, 虽然部分特性在后续的标准中仍然在改进,但是值得好好学习整理一下了。 std::format在形式上和Python的字符串格式化非常类似,对用户很友好。当然由于Python自身是动态的,f-string可以玩得花样更多,写起来更方便,这是C++无论如何也比不了的。 简单示例 从HelloWorld开始 12345678#include <format>#include <iostream>int main() { std::string str = std::format("Hello, {}!", "World"); std::cout << str << '\n'; return...
Cpp VSCode 配置
记录一下VSCode配置C++的内容吧。 插件列表 首先列一下目前在VSCode上使用的,涉及到C++的核心插件: C/C++ (Microsoft):微软官方默认的C/C++插件,禁用了代码提示,但是调试这些还需要用它,不能完全禁用 clangd (LLVM):LLVM官方提供的,当前代码提示的主力插件 CMake (twxs):CMake的语言支持,CMakeLists的语法高亮等 CMake Tools (Microsoft):微软官方提供的CMake支持,提供CMake命令工具条和快捷指令 CodeLLDB (Vadim Chugunov):lldb调试支持,非官方支持 还有两个不太重要的插件: C/C++ Themes (Microsoft) Better C++ Syntax (Jeff Hykin) 补充:通过clangd (LLVM) 插件安装的clangd虽然是最新版本,但是代码修正功能可能有问题,还是直接使用系统中的clangd更加可靠。 C/C++ 插件和 clangd...
Cpp 编译环境笔记
整理一下关于C++编译器的笔记,这部分由于不是科班出身,没学过编译原理之类的课程,细节总是搞不懂, 本文只是基于网络搜集到的各种零散的描述进行整理,不保证正确性!!! 在本文中只关注x64平台,Windows或Linux(Ubuntu)系统的C/C++编译环境,并且不考虑交叉编译等问题。 除了系统原生的MSVC和GCC,重点关注两个概念: MinGW,MinGW-W64,MSYS... LLVM,clang 将它们并列是不合适的,因为它们不是一个层面上的东西,但是这两个确实是我在理解C++编译环境配置时遇到的最大困难。 基本概念 c 语言的标准分成两部分: 语法,指导我们应该怎么编程,在源文件中必须满足某些规则 标准库(头文件),相对于系统层面向 c 语言程序提供的一些基础接口,例如printf等,但语法标准只是规定了接口的形式,并没有具体的实现 对 c 语言的支持,也分成两个部分: c...
GoogleTest + CTest 配置与使用
现在我们关注CMake项目中的测试部分,具体包括GoogleTest和CTest的使用。 概述 Google Test(简称为 gtest)是 Google 开发的一个开源的 C++ 测试框架,用于编写和运行单元测试、集成测试和功能测试。主要特点包括: 支持各种平台和编译器,包括 Linux、Windows 和 macOS,并且与主流的 C++ 编译器兼容。 提供了丰富的断言宏,如 EXPECT_EQ、ASSERT_TRUE 等,用于验证代码行为是否符合预期。 支持参数化测试,允许以不同的参数运行同一个测试用例。 可以生成详细的测试报告,包括测试通过的数量、失败的数量、失败的原因等信息。 可以扩展测试框架,编写自定义的测试扩展和断言宏。 CTest 是 CMake 附带的一个测试工具,用于管理和执行项目中的测试。它是一个命令行工具,可以通过简单的命令来执行测试,并生成测试报告。主要特点包括: 可以在构建系统中自动发现项目中的测试,并执行它们。 支持各种测试框架,包括 Google Test、Catch、Boost.Test...