本文写作的缘由是我在实现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) { // 当然这里如果等于也可以提前返回,这
前言: 本文章主要用于个人学习记录. 我学习过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, 接触过现代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