C ++ 复习
dubug
重点检查边界,取等。while还是if
需要注意图的连通性问题,重边,环。图论vis数组能开则开。
memcpy
void *memcpy(void*dest, const void *src, size_t n);
一般用法:memcpy();
vector用法
初始化
vector(int nSize,const t& t)
:创建一个vector,元素个数为nSize,且值均为t
二维: vector<vector<int> > pre(n + 1, vector<int>(m + 1));
tuple用法
std::tie(name, ages, std::ignore, std::ignore) = tp;
map用法
map是关联容器,sort函数只能用在随机访问迭代器vector,deque上。
map的排序是从小到大按照key进行的,是有序容器。
priority_queue
它和queue不同的就在于我们可以自定义其中数据的优先级, 让优先级高的排在队列前面,优先出队,并且没有front(),back()函数,只用top()访问队首元素
因为priority_queue内部是用堆实现的,所以是堆优化。虽然他是个queue但是其实他的内部是一个堆结构。
push 插入元素到队尾 (并排序)
priority_queue<Type, Container, Functional>
Functional: 可选 less<int>
、greater<int>
从小到大,队头是小,小根堆。
基础知识
3 * 5 / 2 = 7
& 3 / 2 * 5 = 5
&3 * (5 / 2) = 6
除法要加括号!!!
int最大表示为: 2 × 1 0 9 2\times10^{9} 2×109 复杂度计算: 1 0 9 = 1 0 4.5 \sqrt{10^9}=10^{4.5} 109=104.5
二进制
(1LL << x)
等价于 power(2, x)
for (int i = 0; i < (1 << 3); i ++ ) {cout << i << ' ';for (int j = 14; j >= 0; j -- ) {if (i >> j & 1) cout << 1;else cout << 0;}cout << '\n';}
0 000000000000000
1 000000000000001
2 000000000000010
3 000000000000011
4 000000000000100
5 000000000000101
6 000000000000110
7 000000000000111
for 循环遍历的时候的基本用法:
正向:[0, n)
反向:[n -1, 0]
二进制:遍历15位,2^15;
for (int i = 0; i < (1LL << 15); i ++ )
for(int j = 14; j >= 0; j -- )
设i=0
的话,下面的a[i]
实际上是a[1]
,i 还是 =0
所以不要把下面的合成一句写,前面的a[i]
会先执行++导致错误。
index[a[i]] = i;
i ++;
__builtin_popcount(x)
等于:(注意这里一定是31)
Lambda用法
捕获列表 [] 用于定义如何捕获在 lambda 定义之前声明的外部变量。
参数列表 () 用于定义 lambda 的参数,这些参数在调用 lambda 时传递。
捕获列表和参数列表是相互独立的,不会相互影响。
auto solve=[&](int n)
表示用引用的方式捕获;
[]
表示不捕获任何变量,它只能使用直接传递给它的参数和在 lambda 内部定义的变量。
#include <iostream>int main() {int a = 10;int b = 20;// 按值捕获a,按引用捕获bauto lambda = [a, &b](int c) {std::cout << "Inside lambda: a = " << a << ", b = " << b << ", c = " << c << std::endl;// 尝试修改a会影响捕获的副本,不影响外部的a// 尝试修改b会影响外部的b// c 是参数列表中的变量,仅在lambda内部有效// a = 100; // 编译错误,a是按值捕获的,无法修改b = 200; // 修改b,会影响外部的b// c = 300; // 可以修改c,但只在lambda内部有效};int c = 30;lambda(c); // 调用lambda并传递参数cstd::cout << "Outside lambda: a = " << a << ", b = " << b << ", c = " << c << std::endl;return 0;
}
字符、字符串操作
string
: 在最后会加一个\n
,所以如果长度是2,你访问s[2]
不会报错,但你要知道原因。
cin
:跳过空白。
getline(cin, s)
:输入整行字符串。
isalpha()用来判断一个字符是否为字母
isalnum用来判断一个字符是否为数字或者字母,也就是说判断一个字符是否属于a~ z||A~ Z||0~9。
isdigit() 用来检测一个字符是否是十进制数字0-9
islower()用来判断一个字符是否为小写字母,也就是是否属于a~z。
isupper()和islower相反,用来判断一个字符是否为大写字母。
从字符串提取数:
if (isdigit(s[i])) {int j = i, number = 0;while(j < int(s.size()) && isdigit(s[j])) {number = number * 10 + (s[j] - '0');j ++ ;}i = j - 1;
}
STL
排序:
反向:sort(a.rbegin(),a.rend());
正向: sort(a.begin(),a.end());
assign:
vector<int> native_a(n);
native_a.assign(a.begin(), a.end());
find:
返回迭代器,要减去迭代器
find(native_a.begin(), native_a.end(), a[i]) - native_a.begin()
pair的构造
a.push_back({l, r});
cmp比较函数写法:
bool cmp(pair<int, int> a, pair<int, int> b) {return a.first < b.first;
}
max_element
只能用于一维
int max_length = 0;for (int i = 1; i <= n; i++) {max_length = max(max_length, *max_element(f[i] + 1, f[i] + m + 1));}
Codeblocks
ctrl + shift + c
: //
ctrl + shift + x
: undo //