Skip to content

败犬日报 2024-10-08

1. std::unordered_map 扩容

load_factor 即元素数除以桶数,如果这个数大于 max_load_factor 会触发 rehash(扩容到多大应该是实现定义)。

cppref: max_load_factor

2. lambda 递归

用 std::function,但是这个可能属于 std::function 递归而不是 lambda 递归:

cpp
int main() {
    std::function<int(int)> func = [&func](int x) {
        if (x == 0) {
            return 1;
        }
        return x * func(x - 1);
    };
    func(5);
}

用 y 组合子,注意要指定返回值:

cpp
int main() {
    auto func = [](auto self, int x) -> int {
        if (x == 0) {
            return 1;
        }
        return x * self(self, x - 1);
    };
    func(func, 5);
}

用 reducing this(C++23 新增):

cpp
int main() {
    auto func = [](this auto &self, int x) {
        if (x == 0) {
            return 1;
        }
        return x * self(x - 1);
    };
    func(5);
}

3. 结构化绑定不能赋值给已有变量

只能用 std::tie 给已有变量赋值,不能同时创建变量 & 赋值给已有变量。

注:结构化绑定即 auto [a, b] = ...; C++17 新增。

4. 数据库联合索引 (b, a) 如果 where 条件是 a = 1 and b = 1; 会优化成先查 b = 1 吗

MySQL 实测是会的。可能看实现?

实测 MySQL 5.5 (dbfiddle.uk)

5. 新闻时间

今年诺贝尔物理学奖颁给了“人工神经网络”,要不咱改个名吧。