Cpp std::filesystem 学习笔记
关于 C++17 标准库 std::filesystem 的整理笔记。 概述 std::filesystem 是 C++17 引入的标准库模块,用于对文件和目录进行跨平台操作。 它提供了文件路径管理、目录操作、文件判断、遍历、创建和删除等功能,使用时无需依赖操作系统特定 API。 由于 Linux 系统和 Windows 系统的文件系统确实存在很多差异,虽然 std::filesystem 的设计目标是屏蔽平台差异,但实际使用中仍然会存在细微差异。 这里以 Linux 平台为主进行实验,Windows 平台会存在分隔符等差异。 在导入头文件时,一般对命名空间使用如下别名缩写 123#include <filesystem>namespace fs = std::filesystem; 路径基础 std::filesystem 的核心类型是 std::filesystem::path,用于表示文件或目录的路径,它并不会具体指代相对路径或绝对路径,只是简化了一些对路径常用的字符串解析操作,然后再对接底层提供的文件系统操作。 创建路径对象 可以直接使用字符串创建路径 12s...
C++ Import std
记录一下如何使用 C++20 和 C++23 所提出的模块,尤其是 std 模块。 编译环境: Linux 系统 Ubuntu 24 clang++20,使用libc++ 测试代码 main.cpp123456import std;int main() { std::println("Hello, World!"); return 0;} 首先需要预编译libc++的std模块: 1clang++ -std=c++23 -stdlib=libc++ --precompile -x c++-module /usr/lib/llvm-20/share/libc++/v1/std.cppm -o std.pcm 得到的产物 std.pcm 存放在当前目录,然后和源文件一起进行编译 1clang++ -std=c++23 -stdlib=libc++ -fmodule-file=std=std.pcm main.cpp -o main 最终可以顺利编译,没有报错,正常输出 Hello,world! 目前只尝试了这一种做法,对于g++...
LaTeX Tikz 绘图积累
Tikz 绘图的内容非常复杂,目前没有精力去仔细学习,只是简单记录一些可能用到的例子。一部分例子是我自己绘制的,更多的则是参考的网上公开资料。 Tikz 相关教程例如:TikZBolg。 有一些在线绘图工具可以可视化绘制简单图形,并导出 Tikz 代码,例如:Mathcha。 对于更复杂的需求,可以使用专业的矢量图绘制软件(例如 Inkscape) 绘制并导出 Tikz 代码。 函数图像 1234567891011121314151617181920\documentclass[border=2mm]{standalone}\usepackage{amsmath,amssymb,amsfonts,amsthm}\usepackage[dvipsnames]{xcolor}\usepackage{tikz}\begin{document}\begin{tikzpicture} \draw[->] (-0.5, 0) -- (6, 0) node[ab...
Python 命令行脚本模板
在日常经常写一些 Python 命令行脚本来简化操作,有一些代码逻辑是通用的,直接让 AI 生成的话,风格不够统一,还需要不断调整,这里提供一个命令行脚本的初始模板,包括日志(支持彩色)和命令行参数解析。 template_script.py123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113import loggingimport argparseclass Colors: RED = "\033[31m" GREEN = "\033[32m" YELLOW = "\033[33m" BLUE...
Cpp 练习——基于模板编程的通用数据读写
在日常编程中,我们可能需要处理以分隔符(如逗号、空格或制表符)分割的文本数据,例如 CSV 文件、几何数据文件等,每一行可能有多个整数或浮点数数据。 为各种不同的数据结构写专门的解析器会非常繁琐,我们可以利用模板编程中的递归模板和元组来实现通用的数据读写: 读取 / 写入任意类型字段组合的数据记录; 支持自定义分隔符; 支持忽略注释和多余空格。 实现代码: data_record_io.hpp123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105#pragma once#include <algorithm>#include <cctype>#include <iostream>#inc...
Cpp 练习——模仿Qt的信号槽
基本概念 首先定义如下的概念: 接收元件:Receiver<Y,Ym> 发送元件:Sender<Ym> 接收者:拥有至少一个接受元(公开成员)的类 发送者:拥有至少一个发送元件(公开成员)的类 中转者:既是发送者也是接收者的类 其中:Ym是信息类型, Y是接收者类型,接收元件和发送元件必须使用同样的信息类型Ym, 才能建立联系进行信息传递。 信息会从建立连接的发送元件传递到接收元件,发送元件和接收元件之间可以是一对多或多对多地建议联系。 具体说明 元件之间的连接 发送元件和接收元件之间的连接是双向且对等的(与QT的信号和槽函数机制不同), 它们都可以与对方绑定与解绑(一对多,多对多) 1234567sender.bind(receiver); // 发送元件可以绑定接收元件sender.unbind(receiver); // 发送元件可以解绑接收元件sender.unbind_all(); // 发送元件可以解绑所有的接收元件, 在析构时会自动调用receiver.bind(sender); // 接收元件可以绑定发送元件receiver.unbin...
Cpp 练习——编译期异类词典
代码参考:《C++模板元编程实战:一个深度学习框架的初步实现》。 实现代码如下 var_type_dict.hpp12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218...
Cpp 练习——侵入式的调用栈追踪
基于 C++20 的 std::source_location 和宏实现侵入式的函数调用栈追踪。 mtracer.hpp12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970#pragma once#include <algorithm>#include <cstddef>#include <source_location>#include <stack>#include <string>class MTracer {public: // NOLINTNEXTLINE(fuchsia-default-arguments-declarations) explicit MTracer(const std::source_location &location = ...
基于 SVD 实现图片压缩
图像本质上就是一个或多个矩阵,并且通常具有低秩结构,可以利用SVD分解舍弃低奇异值的部分来实现图片的压缩存储。 简单的 Python 示例实现如下 1234567891011121314151617181920212223242526import numpy as npimport matplotlib.pyplot as pltfrom PIL import Imagedef compress_img_first_k(img_array, k): if img_array.ndim == 2: img_array = img_array[:, :, np.newaxis] m, n, c = img_array.shape compressed_channels = [] for i in range(c): channel = img_array[:, :, i] U, S, VT = np.linalg.svd(channel, full_matrices=False) channel_k =...
Python 单元测试 unittest / pytest
整理一下 Python 单元测试的内容,包括: 内置的单元测试模块 unittest 第三方测试工具 pytest 除此之外,其实还有直接解析源码注释,获取测试用例的内置模块 doctest。 准备 为了便于描述,下面准备两个函数和一个类作为测试目标,构成 my_module.py my_module.py1234567891011121314151617181920def my_add(a, b): return a + bdef my_divide(a, b): return a / bclass MyDict(dict): def __init__(self, **kw): super().__init__(**kw) def __getattr__(self, key): try: return self[key] except KeyError: raise AttributeError(r"'MyDict' object ha...
