wnw231423's blog

Reason the world.

Binary Search: Searching for Bounds Rather Than Elements

发布于 # Algorithm

本文写作的缘由是我在实现B+树时,在做二分查找方面碰到了一点障碍,感觉怎么写代码都有点不顺畅,所以整理了一下。 Binary Search in B+Tree 我们首先从单纯的二分查找开始,假设要寻找的元素为 key,有序数组大小为 n,一个可能的实现如下: int binary_search(int key, int n) { // 首先确定搜索区间,[start, end) // 采用开区间可以不用处理数组为空的边界情况 int start = 0; int end = n; int l = start; int r = end; while (l < r) { int mid = (l + r) / 2; int mid_key = array[mid]; if (mid_key >= key) { // 当然这里如果等于也可以提前返回,这

Project with Modern C++ 01: Classes

发布于 # C++

本文主要关注“如何组织 class”,对 Modern C++中定义 class 时的各种关键字和各种成员函数做一下学习。参考资料如下: 项目: CMU 15-445 Fall 2025 Project 1: Buffer Pool Manager CMU 15-445 Fall 2025 Project 2: B+ Tree 书籍:Effective Modern C++ 1. Introduction 在通常个人编写一些简单的小软件时,可能鲜有机会“手动地”定义 class,对于各种构造函数,析构函数都是直接使用 C++ 的默认函数。所以我们先给出项目中具体的 class 的代码作为示例: /** * @brief An RAII object that grants thread-safe read access to a page of data. * * The

Rust to modern C++ 04: Concurrency && Asynchronous Start

发布于 # C++

前言: 本文章主要用于个人学习记录. 我学习过Rust, 接触过现代C++代码, 但未做系统性学习, 本文章尝试做一些学习梳理. 如有错误, 欢迎批评指正. 参考资料: C++ Concurrency In Action (文中简称 CCIA ). Basic 在Rust中, 我们通过thread::spawn()创建一个JoinHandle对象, 并使用join()来汇入. fn main() { let handle = thread::spawn(|| {...}); // -snip handle.join().unwarp(); } 在C++中, 类似地, 我们创建一个std::thread对象. 区别于Rust, 由于离开作用域后, std::thread的析构函数会调用std::terminate(), 所以我们必须在销毁前决定是join还是detach. 而在R

Rust to modern C++ 03: Rvalue Refs, Move Semantics & Perfect Forwarding

发布于 # C++

前言: 本文章主要用于个人学习记录. 我学习过Rust, 接触过现代C++代码, 但未做系统性学习, 本文章尝试做一些学习梳理. 如有错误, 欢迎批评指正. 参考资料: Effective Modern C++ The Story of lvalue and rvalue 从概念上来说,lvalue你一般可以取到其地址,而rvalue则是临时的,一般没办法取到地址。在C语言中,lvalue和rvalue仅仅是编译器为了能够表达5 = a的报错引入的概念。当把一个对象赋值给另一个对象时,都是深拷贝。 C++继承自C,自然也采用了深拷贝。那么问题来了,面对以下代码: std::vector<int> v2 = v1; std::string result = s1 + s2 + s3; 在C语言中, 面对大的数据, 一般都是直接操作指针, 例如: struct buf *b2