c++

transform(a.begin(), a.end(), b.begin(), Lambda) 把 a 中的元素改为 b 中的元素经过 Lambda 后的元素。

内建函数

builtin 是内建的意思。下面函数的时间复杂度都是 \(O(1)\) 的。

__builtin_ctz(x) 返回末尾的 0 的个数(__builtin_ctz(0) 未定义)。这个函数在 Binary Gcd 中用到。

__builtin_popcount(x) 返回二进制下的 popcount。

Lambda

简单函数

[] 中,[=] 捕获外面所有的值,[&] 捕获外面所有的变量(可在函数内修改),[x] 捕获特定的值,[&x] 捕获特定的变量。

(如果和外面变量重名,会 shadow 外面的变量,当然还是建议不重名)

auto 返回的是类型是编译器推导出来的。

注意最后面要加个 ;,因为这本质是一种定义操作。

auto add = [&](int a, int b){
	return a + b;
};

auto greet = [&](const std::string& name, int age){
	std::cout << "Hello " << name << ", you are " << age << " years old." << std::endl;
};

auto sayHello = [&]{
	std::cout << "Hello!" << std::endl;
};

不敢 auto 的话,可以这样定义返回值类型:

auto explicitReturn = [&](double a, double b) -> double {
	if (b == 0) return 0; // 需要显式返回类型来统一返回类型
	return a / b;
};

递归函数

function<void(int)> dfs = [&](int x) 等价于 void dfs(int x)

function<void(int&)> dfs = [&](int &x) 等价于 void dfs(int &x)

function<void(int, int)> dfs = [&](int x, int y) 等价于 void dfs(int x, int y)

function<void(int, string)> dfs = [&](int x, string y) 等价于 void dfs(int x, string y)

function<void(int&, int)> dfs = [&](int &x, int y) 等价于 void dfs(int &x, int y)

function<void(int&, int&)> dfs = [&](int &x, int &y) 等价于 void dfs(int &x, int &y)

function<int(int&, int&)> dfs = [&](int &x, int &y) 等价于 int dfs(int x)

vector

开太多 vector 可能会影响运行时间,因为 vector 初始化空间需要时间。

assign

vt.assigen(size, val) 先清空 vector,再加入 size 个 val。注意必须得加后面那个 val。

resize

vt.resize(size, val),可以不加后面那个 val,然后按照如下执行:

from:https://blog.csdn.net/qq_45819091/article/details/122050776

insert

vt.insert(vt.begin(), val) 可以 \(O(n)\) 再开头插入 val。

erase

可以删除指定元素,也可以 vt.erase(first,lase) 删除 \([first,last)\) 内的元素。

所以就可以写 vt.erase(unique(vt.begin(),vt.end()), vt.end())

array

可以看作一个封装的数组,但支持字典序比较,显然是比 vector 常数更小。但是注意交换 array 的复杂度是 \(O(n)\),不像其他 STL 是 \(O(1)\)

array<type, len> a 定义,注意如果是局部定义的且没初始化,内部元素不一定是 \(0\)。可以 array<atpy, len> a{1,2,3} 初始化,还可以 a.fill(val) 全改为 val。

assert

assert v.断言;生效;维护自己的权利

表达式为真,继续执行程序,否则程序停止,并告诉你是哪一行的 assert failed。

注意不要写 assert(++x > 0) 这种东西,有副作用。

字符

\" 表示双引号,\\ 表示反斜杠本身

memset

介绍:https://blog.csdn.net/PuddleRubbish/article/details/128407260

int是2进制32位的,即16进制8位

uint_max=0xffffffff

int_max=0x7fffffff

memset memcpy memstr 自带极大常数优化,一般用于卡常,少用

posted @ 2025-09-25 16:17  hhhqx  阅读(13)  评论(0)    收藏  举报