变量类型
| 类型 |
含义 |
典型大小 |
是否有符号 |
取值范围(约) |
| short |
短整型 |
2B |
有 |
-3e4 ~ 3e4 |
| int |
标准整型 |
4B |
有 |
-2e9 ~ 2e9 |
| long |
长整型 |
4B/8B |
有 |
平台相关 |
| long long |
更长整型 |
8B |
有 |
±9e18 |
| unsigned int |
无符号整型 |
4B |
无 |
0 ~ 4e9 |
| uint32_t |
固定32位整型 |
4B |
无 |
0 ~ 2^32-1 |
| int64_t |
固定64位整型 |
8B |
有 |
±2^63 |

| 类型 |
含义 |
大小 |
精度 |
备注 |
| float |
单精度浮点 |
4B |
~7位有效数字 |
性能较好 |
| double |
双精度浮点 |
8B |
~15位有效数字 |
默认推荐 |
| long double |
高精度浮点 |
8/16B |
更高 |
平台相关 |
| 类型 |
含义 |
大小 |
备注 |
| char |
字符 |
1B |
本质是整数 |
| signed char |
有符号字符 |
1B |
很少用 |
| unsigned char |
无符号字符 |
1B |
常用于原始数据 buffer |
| wchar_t |
宽字符 |
2/4B |
Unicode |
| 类型 |
含义 |
大小 |
取值 |
| bool |
布尔类型 |
1B |
true/false |
| 类型 |
含义 |
用途 |
| void |
无类型 |
函数无返回值 |
| void* |
通用指针 |
可指向任意类型 |
| 修饰符 |
作用 |
示例 |
| const |
常量 |
const int a = 10 |
| signed |
有符号 |
signed int |
| unsigned |
无符号 |
unsigned int |
| short |
更短 |
short int |
| long |
更长 |
long int |
| 类型 |
位数 |
是否有符号 |
取值范围 |
| int8_t |
8 |
有 |
-128 ~ 127 |
| uint8_t |
8 |
无 |
0 ~ 255 |
| int16_t |
16 |
有 |
±3e4 |
| uint16_t |
16 |
无 |
0 ~ 65535 |
| int32_t |
32 |
有 |
±2e9 |
| uint32_t |
32 |
无 |
0 ~ 4e9 |
| int64_t |
64 |
有 |
±9e18 |
| uint64_t |
64 |
无 |
0 ~ 2^64-1 |
| 固定型,位数“严格固定”的整数类型,不管在什么机器 / 操作系统 / 编译器上,它的大小都不会变。 |
|
|
|
Struct

- 连续存储
- 内存padding问题(cache / 带宽 / CPU对齐)


基本语法
输入输出
int a;
cin >> a;
cout << "value=" << a << endl;
条件语句
if
if (a > 0) {
cout << "positive";
} else if (a == 0) {
cout << "zero";
} else {
cout << "negative";
}
switch
switch (a) {
case 1: cout << "one"; break;
case 2: cout << "two"; break;
default: cout << "other";
}
循环
for
for (int i = 0; i < 5; i++) {
cout << i << endl;
}
while
int i = 0;
while (i < 5) {
i++;
}
range-based for
for (auto x : v)
continue
break
数组
int arr[3] = {1, 2, 3};
运算符
| 类别 |
运算符 |
示例 |
说明 |
| 算术运算 |
+ - * / % |
a + b |
基本数学运算 |
| 自增自减 |
++ -- |
i++ / --i |
+1 / -1 |
| 赋值 |
= |
a = 10 |
赋值 |
| 复合赋值 |
+= -= *= /= %= |
a += 2 |
a = a + 2 |
| 比较运算 |
== != > < >= <= |
a > b |
返回 bool |
| 逻辑运算 |
&& | | ! |
a > 0 && b > 0 |
与/或/非 |
| 位运算 |
& | ^ ~ |
a & b |
按位操作 |
| 位移 |
<< >> |
a << 2 |
左移/右移 |
| 条件运算 |
?: |
a>0 ? x : y |
三元表达式 |
| sizeof |
sizeof |
sizeof(int) |
类型/变量大小 |
| 地址运算 |
& |
&a |
取地址 |
| 解引用 |
* |
*p |
指针取值 |
| 成员访问 |
. |
obj.x |
struct/class 成员 |
| 指针访问 |
-> |
ptr->x |
指针访问成员 |
| 下标 |
[] |
arr[i] |
数组/容器访问 |
| 函数调用 |
() |
f(x) |
调用函数 |
Pointer
指针,引用
容器
list

| 类别 |
用法/函数 |
示例代码 |
说明 |
| 定义 |
list<T> |
list<int> l; |
定义空链表 |
| 初始化 |
初始化列表 |
list<int> l = {1,2,3}; |
直接赋值 |
| 插入尾部 |
push_back |
l.push_back(4); |
尾部插入 |
| 插入头部 |
push_front |
l.push_front(0); |
头部插入 |
| 删除尾部 |
pop_back |
l.pop_back(); |
删除最后一个 |
| 删除头部 |
pop_front |
l.pop_front(); |
删除第一个 |
| 访问头尾 |
front / back |
l.front(), l.back() |
访问首尾元素 |
| 判空 |
empty |
l.empty() |
是否为空 |
| 大小 |
size |
l.size() |
元素个数 |
| 遍历 |
range for |
for(auto x : l) |
推荐遍历方式 |
| 迭代器 |
iterator |
auto it = l.begin(); |
指向元素 |
| 插入中间 |
insert |
l.insert(it, 10); |
在迭代器前插入 |
| 删除元素 |
erase |
l.erase(it); |
删除某位置 |
| 查找 |
find(需algorithm) |
find(l.begin(), l.end(), x) |
查找元素 |
| 排序 |
sort |
l.sort(); |
链表排序(内部实现) |
| 反转 |
reverse |
l.reverse(); |
反转链表 |
| 清空 |
clear |
l.clear(); |
清空所有元素 |
| 有序列表拼接 |
merge |
|
必须先排序 |
| 迭代器入口 |
begin |
auto it = l.begin(); |
指向第一个元素 |
| 迭代器出口 |
end |
auto ed = l.end(); |
指向“尾后”(不是最后一个) |
| 删除元素 |
remove |
l.remove(3); |
删除所有等于 value 的元素 |
| 插入list |
splice |
l1.splice(it, l2); |
把 l2 所有元素插入到 l1 的 it 位置 |
vector
| 类别 |
用法/函数 |
示例代码 |
说明 |
| 定义 |
vector<T> v; |
vector<int> v; |
定义空向量 |
| 初始化 |
初始化列表 / 指定大小 |
vector<int> v = {1,2,3}; |
直接赋值 |
|
|
vector<int> v(5); |
默认值 0 初始化长度为5 |
| 尾部插入 |
push_back |
v.push_back(10); |
在尾部添加元素 |
| 尾部删除 |
pop_back |
v.pop_back(); |
删除最后一个元素 |
| 访问元素 |
下标 / at |
v[0], v.at(0); |
下标不检查越界 / at 会检查越界 |
| 首尾元素 |
front / back |
v.front(), v.back(); |
访问首尾元素 |
| 判空 |
empty |
v.empty() |
是否为空 |
| 大小 |
size / capacity / resize |
v.size(), v.capacity(), v.resize(10) |
元素个数 / 容量 / 改变大小 |
| 遍历 |
range-based for / iterator |
for(auto x : v) |
推荐遍历方式 |
| 迭代器 |
begin / end / rbegin / rend |
auto it = v.begin(); |
正序 / 反序迭代器 |
| 插入 |
insert |
v.insert(v.begin()+1, 5); |
在指定位置插入元素 |
| 删除 |
erase |
v.erase(v.begin()+1); |
删除指定位置元素 |
| 清空 |
clear |
v.clear(); |
清空所有元素 |
| 排序 |
sort (algorithm) |
sort(v.begin(), v.end()); |
STL 排序 |
| 反转 |
reverse (algorithm) |
reverse(v.begin(), v.end()); |
STL 反转 |
| 查找 |
find (algorithm) |
auto it = find(v.begin(), v.end(), 3); |
查找元素 |
| 容量管理 |
reserve / shrink_to_fit |
v.reserve(100); v.shrink_to_fit(); |
预分配 / 收缩内存 |
| 查找 |
find (algorithm) |
auto it = find(v.begin(), v.end(), 3); |
查找元素 3,返回迭代器,找不到返回 v.end() |
| 累加 |
accumulate (numeric) |
int sum = accumulate(v.begin(), v.end(), 0); |
累加所有元素,初始值 0 |
元素遍历方法
std::vector<int> v = {1,2,3,4,5};
for(size_t i=0; i<v.size(); ++i)
std::cout << v[i] << " ";
std::vector<int> v = {1,2,3,4,5};
for(auto it=v.begin(); it!=v.end(); ++it)
std::cout << *it << " ";
std::vector<int> v = {1,2,3,4,5};
for(auto &x : v)
x += 1; // 可以直接修改元素
stack
map
set
queue
deque
array
iterator
advance
prev
next
lambda
algorithm
sort
find
overload
class
STL
numeric