C++ new & delete
C++ 的 new 和 delete 是动态内存核心,但现代代码中应避免裸用。理解其机制避免陷阱:new 分配内存+构造对象,delete 析构+释放内存。 1. Widget 示例类(全局唯一定义) #include <print> #include <format> class Widget { public: Widget(int value) : value_(value) { std::println("Widget constructed with value: {}", value_); } ~Widget() { std::println("Widget destroyed"); } private: int value_; }; 2. new 表达式 vs operator new 函数 new 表达式(语言操作符,不可重载):分配内存(调用 operator new)+构造对象,失败抛 std::...
C++ Stl Allocator
Allocator 是 C++ STL 容器内存管理的核心。它直接决定程序的内存效率和性能瓶颈。默认的 std::allocator 在高性能场景下往往不够用,但记住我的铁律:简单第一,复杂是敌人。 1. Allocator 的核心接口 STL 容器通过 allocator 抽象内存管理,解耦内存分配与容器逻辑。一个合格的 allocator 必须满足 allocator_traits 的要求: pointer allocate(size_t n): 分配 n 个元素内存,返回 pointer。 void deallocate(pointer p, size_t n): 释放内存。 rebind<U>::other: 用于类型转换。 重要:C++17 起,construct 和 destroy 成员函数已废弃。C++23 标准中已完全移除。使用 std::construct_at 和 std::destroy_at 代替。 // C++17+ 推荐方式 #include <memory> template <typename U, typename....
Cpp Callable Objects
在 C++ 中,Callable Object(可调用对象) 指的是任何可以像函数一样被调用的事物。简单来说,就是任何可以使用 () 运算符(Function Call Operator)的对象。 在现代 C++(C++11 及以后)中,可调用对象的概念非常重要,因为它是 STL 算法、线程(std::thread)以及回调机制的核心。 C++ 中的可调用对象主要分为以下 5 类。 1. 普通函数与函数指针 (Function Pointers) 这是最基础的形式,继承自 C 语言。 特点: 没有状态(Stateless),行为固定。 适用场景: 简单的回调,也就是所谓的 C 风格 API。 #include <print> void hello() { std::println("Hello from Function Pointer!"); } int main() { // 定义函数指针 void (*funcPtr)() = &hello; // & 是可选的 // 调...
C++ namespace
C++命名空间是语言的核心特性之一,用于解决名字冲突问题,尤其在大项目或使用多个库时。基于最新C++23标准,命名空间用法稳定,但结合模块(modules)使用更高效。下面直击要害,逐一拆解,包括[inline namespace]、匿名命名空间和命名空间别名。 参考:[cppreference.com] 1. 基本用法:声明与定义 命名空间通过namespace关键字声明,内容可以分散在多个文件中定义(如同函数定义)。 namespace MyLib { int add(int a, int b) { return a + b; } class Widget { public: void use(); }; } 使用方式: 限定名:MyLib::add(1, 2); 最安全,避免污染全局。 using声明:using MyLib::add; 只引入add,作用域内可用add(1,2)。 using指令:using namespace MyLib; 引入整个空...
Rust Iterator
什么是 Rust 迭代器? Rust 的迭代器(Iterator)是一种强大的抽象,它允许你遍历集合元素而不需要关心底层数据结构的具体实现。迭代器模式是函数式编程的核心概念之一,Rust 在这方面做得特别出色。 迭代器的基本概念 在 Rust 中,任何实现了 Iterator trait 的类型都可以称为迭代器: pub trait Iterator { type Item; fn next(&mut self) -> Option<Self::Item>; } 核心方法 next() 返回 Option<Item>,当迭代完成时返回 None。 创建迭代器的方法 1. iter() - 不可变引用迭代 fn main() { let vec = vec![1, 2, 3, 4, 5]; // 使用 iter() 创建迭代器 let mut iter = vec.iter(); assert_eq!(iter.next(), Some(&1)); ...
Common Algo
1. 贪心算法 (Greedy Algorithm) 核心思想: 每一步都做出局部最优选择,希望最终得到全局最优解。 适用场景: 具有「最优子结构」和「贪心选择性质」的问题。 示例:活动选择问题 #include <vector> #include <algorithm> struct Activity { int start, end; }; // 按结束时间排序 int maxActivities(std::vector<Activity>& acts) { std::sort(acts.begin(), acts.end(), [](const Activity& a, const Activity& b) { return a.end < b.end; }); int count = 1; int last_end = acts[0].end; for (...
C++ 三路比较 (Three-way Comparison)
简介 C++20 引入了三路比较运算符 <=>,也被称为"宇宙飞船运算符"(spaceship operator)。这个运算符可以一次性确定两个对象之间的所有比较关系(小于、等于、大于),大大简化了比较运算符的实现。 传统比较运算符的问题 在 C++20 之前,如果我们想为一个自定义类型实现完整的比较运算符,需要分别实现六个运算符: class Point { public: int x, y; bool operator==(const Point& other) const { return x == other.x && y == other.y; } bool operator!=(const Point& other) const { return !(*this == other); } bool operator<(const Point&...


