今天又双叒叕来水博客了……(不务正业)
令人尖叫的STL
algorithm 系列
fill, fill_n 填充数组
1 2
| fill(a, a+n, INF); fill_n(a, n, INF);
|
unique, unique_copy 对排序后数组去重
1 2 3
| sort(a, a+n); unique_copy(a, a+n, b, 重载==); unique(a, a+n, 重载==);
|
reverse, reverse_copy 镜像翻转数组
1 2
| reverse_copy(a, a+n, b); reverse(a, a+n);
|
rotate, rotate_copy 数组轮换
1 2 3
| int a[] = {1,2,3,4,5,6}; rotate_copy(a, a+2, a+6, b); rotate(a, a+5, a+6);
|
random_shuffle 随机打乱数组
partial_sort 数组一次性取前k小
时间复杂度$n \log m$
1
| partial_sort(a, a+k, a+n, 重载<);
|
partition, partition_copy 元素分成两组
1 2 3 4
| Point* mid = partition(p, p+n, [o1, o2](const Point& a) { return (o2-o1).det(a-o1) > 0; });
|
还有stable_partition版本
merge, inplace_merge 归并数组
1 2 3
| merge(a, a+aLen, b, b+bLen, c, 重载<); inplace_merge(a, a+mid+1, a+aLen, 重载<);
|
equal_range 找到存在区间
1 2 3
| sort(a, a+n);
pair<int*, int*> bounds = equal_range(a, a+n, 10, 重载<);
|
make_heap O(n)建堆
sort_heap 对堆排序
1 2
| make_heap(a, a+n, 重载<); sort_heap(a, a+n, 重载<);
|
push_heap 堆加入一个元素
1 2
| a[n++] = 666; push_heap(a, a+n, 重载<);
|
pop_heap 堆删除顶端元素
1
| pop_heap(a, a+n--, 重载<);
|
lexicographical_compare 字典序小于
1 2
| if (lexicographical_compare(s1, s1+len1, s2, s2+len2)) printf("s1 < s2\n");
|
next_permutation, prev_permutation 求下一排列
1 2 3
| int a[] = {1, 2, 3, 4, 5}; prev_permutation(a, a+5); next_permutation(a, a+5);
|
Containers 系列
用到烂的知识点就不多提了。这里只写容易忘的。
bitset
构造函数
bitset<size_t N> foo(int);
bitset<size_t N> foo(std::string);
特性
- 长度在编译期确定
- 高位在左,低位在右
- 重载的方括号可以直接读取、操作位
常用函数
size_t count() 返回1的个数
bool test(size_t pos) 返回非引用的foo[pos]
bool any() 是否有1
bool none() 是否全0
bool all() 是否全1
bitset& set() 全部位设置为1
bitset& set(size_t pos, bool val=true) 设置某个位
bitset& reset() 全部设置为0 (也可有参数pos)
bitset& flip() 反转全部位 (也可有参数pos)
string to_string(char zero, char one) 按要求转化为string
unsigned long to_ulong() 转化为UL
ULL to_ullong 转化为ULL (C++11)
map
构造函数
map<type1, type2> mymap;
map<type1, type2> mymap({})
特性
- 内部用平衡树实现
- 不允许重复的Key
- 访问必须用迭代器
map<type1, type2>::iterator it;
it->first 是Key,不可更变,it->second 是Value,可以修改。
- 查找元素必须用
it = mymap.find(Key),失败则返回mymap.end();
常用函数
- 重载方括号,若Key不存在则建立Key对应的默认构造Value。返回Value的引用。
insert() 比较复杂,常用例子:mp.insert(pair<char, int>('a', 1));
iterator begin() 指向头元素的迭代器 (rbegin()指向最后一个元素)
iterator end() 指向尾元素的后一个迭代器(rend()指向头元素的前一个迭代器)
iterator find(Key) 返回Key对应的迭代器,失败则返回end()。
clear() 清空所有键值对,size归零。
size_type erase (const key_type& k); 删除Key对应的键值对,返回删除个数
iterator erase (const_iterator position); 删除迭代器指向的键值对,返回紧接下一个键值对的迭代器。
iterator erase (const_iterator first, const_iterator last); 删除迭代器指向的左闭右开区间的键值对,返回紧接着下一个键值对的迭代器(或end())。
- 注意,C++98中
erase()不会返回迭代器,而是返回void
iterator lower_bound (const key_type& k); 所在上界迭代器
iterator upper_bound (const key_type& k); 所在下界迭代器
set
结点只有一个元素,不允许重复的红黑树。
常用函数
- 迭代器begin(), end(), rbegin(), rend().
- 容量empty(), size();
- 插入
pair<iterator, bool> insert(const value_type& val); 同时有非const的右值引用版本。
- 返回的pair包括一个指向被插入值的迭代器,bool指明是否真的发生了插入操作。(如果元素被来就存在,就为false)
- 删除
iterator erase(const_iterator position); 删除指定迭代器位置的元素。返回紧接着的下一个元素的迭代器。
iterator erase(const_iterator first, cosnt_iterator last); 删除指定迭代器的左闭右开区间的元素。返回紧接着的下一个元素的迭代器。
size_type erase(const value_type& val); 删除指定的值。 返回被删除的元素个数(0或1)。
- 交换
swap(set& x); 交换两个类型相同的set。
- 清空
clear();
- 查找
iterator find(const value_type& val);
- 计数
size_type count(const value_type& val) const;
- 上下界(左闭右开)
iterator lower_bound (const value_type& val);
iterator upper_bound (const value_type& val);
pair<iterator,iterator> equal_range (const value_type& val); 包括了下界和上界。
C标准库 系列
assert 断言
1 2 3 4 5 6
| #include <cassert>
assert(this->ch[0]->fa == this); assert(this->ch[1]->fa == this); #define NDEBUG
|
isdigit 判断字符是否十进制数
1 2 3 4
| #include <cctype>
while (!isdigit(c=getchar())) if (c=='-') minus = true;
|
泯灭人性的数据类型
内存使用
| 类型 |
字节数 |
估计范围 |
| int |
4 |
±2e9 |
| short |
2 |
±3e4 |
| char |
1 |
保有127 |
| float |
4 |
37数量级,7位 |
| double |
8 |
307数量级,15位 |
| long double |
16 |
4931数量级,20位 |
| long long |
8 |
9e18 |
| __int128_t |
16 |
8.5e37 |
计算struct内存时要小心!最好使用sizeof的方式计算内存。
scanf和printf
| 类型 |
符号 |
| unsigned int |
%u %o(8进制) %x(16进制) |
| unsigned long long |
%llu |
| double |
入%lf,出%f |
| long double |
%Lf |
| __int128_t |
不可用 |
读入行
gets()已经被删除。
读入int之类的操作不会吃掉行末,这会导致下一个getline(st, size)得到空串。
保险起见,应当自定义读入行。