本文将简要介绍 cppreference 的 cpp 部分中,较为古典且常用的部分
同时,本文也尽量包含部分在特定场景中较为实用的内容
注意:许多较为现代的,或者更多应用于项目的内容并未提及,请自行查找
# 容器库
在阅读以下容器的相关页面时,可以留心 迭代器 概念:可以将其理解为包装过的指针
本部分包含了若干容器,以下是较为常用的容器,按高频到低频(主观)排序:
# vector
可以搜索一下 vector 的底层实现方法
# set(及 multiset)
可以重点关注 .lower_bound(...)
等成员函数,及迭代器的用法
# map
可以关注 元素的插入删除机制 以及 operator[]
# deque
可以常数时间下标访问,但是内存不连续
# priority_queue
可以了解如何修改或自定义比较函数,例如 priority_queue<T, vector<T>, greater<T>>
# unordered_map
可以学习哈希表相关知识
# array
可以当作部分 pair 和 tuple 的替用品,或者替代原生数组
# 一些其他容器
# bitset
# basic_string
另外,可以参阅 C 的字符串函数
# IO
# cpp 风格 IO
可以了解 stringstream 类,以及 输入/输出操纵符
# C 风格 IO
# fopen
# freopen
# sscanf
# sprintf
# 算法库
# sort
# unique
# reverse
# shuffle
# nth_element
# lower_bound
# next_permutation
本部分为较为常用的语法糖或语法特性
# 类
可以了解静态成员,构造及析构函数,并使用这些特性(例如分段计时,记录 dfs 深度等)
示例:
int global_indent = 0;
struct indenter{
indenter() { global_indent++; }
~indenter() { global_indent--; }
};
void doIndent() {
for (i = global_indent; i; i--) { printf(" "); }
}
void dfs(...) {
indenter _ind;
doIndent(); fprintf(stderr, "log...\n");
for (...) dfs(...);
}
# 基于范围的 for 循环
示例:
vector <int> vec;
for (...) vec.push_back(...);
for (auto it: vec) {...}
# lambda 表达式
推荐找点实例来看,在一定程度上能简化代码。注意效率可能较低
示例:
sort(a, a + n, [] (int p, int q) { return p > q; });
queue <int> que;
auto doPush = [&] (int ff) {
dis[ff] = ...;
que.push(ff);
};
doPush(1);
while (!que.empty()) {
for (...) {
doPush(...);
}
}
本部分较为不常用,简要了解即可
# 正则表达式库
正则表达式方言较多,可去网上学习一下
使用起来略麻烦,但是比 以流为基础的 IO(scanf 类)强
# 工具库/动态内存管理
较为现代的指针