C++头文件
#include <iostream>
using namespace std;
// 万能头
#include <bits/stdc++.h>
using namespace std;
using namespace std;
// 万能头
#include <bits/stdc++.h>
using namespace std;
交换函数
swap(a, b):交换两个变量的值
C++基本数据类型
- 整型:短整型(short)、基本整型(int)、长整型(long long)
- 浮点型:单精度(float)、双精度(double)、扩展双精度(long double)
(默认输出精度为6位有效数字) - 其他:字符型(char)、布尔型(bool)
信息的单位
- 1 byte = 8 bit
- 1 KB = 1024 byte
- 1 MB = 1024 KB
- 1 GB = 1024 MB
- 1 TB = 1024 GB
变量存储空间大小计算
sizeof(变量名):返回变量所占字节数
逻辑运算符
!:逻辑非&&:逻辑与||:逻辑或
运算符优先级(从高到低)
- 逻辑非运算符:
! - 算术运算符:
+ - * / % - 关系运算符:
> >= < <= == != - 逻辑与运算符:
&& - 逻辑或运算符:
|| - 赋值运算符:
= += -= *= /= %= - 长度运算符:
sizeof
常量定义
const int MAXN = 100; // 示例:定义整型常量
// 格式:const 类型 变量名 = 值;
// 格式:const 类型 变量名 = 值;
内存拷贝函数 memcpy
memcpy(b, a, sizeof(a)):复制数组a的所有数据到数组bmemcpy(b, a, sizeof(int) * k):复制数组a的前k个元素到bmemcpy(b, a, sizeof(double)):复制双精度浮点数数组- 需要头文件:
#include <cstring>
Map 容器
ma[ ]:访问元素,若不存在则创建并初始化为0ma.size():返回元素个数ma.count(element):判断元素是否存在(返回1或0)ma.clear():清空mapma.lower_bound():返回键值 ≥ 给定元素的第一个位置ma.erase(it):删除迭代器指向的元素ma.erase(key):删除指定键的元素ma.erase(it, ma.end()):删除一段区间
second << endl;">
map<string, int>::iterator it; // 声明迭代器
cout << it->first << ":" << it->second << endl;
cout << it->first << ":" << it->second << endl;
二分查找函数
lower_bound(first, last, val):返回第一个 ≥ val 的位置upper_bound(first, last, val):返回第一个 > val 的位置binary_search(first, last, val):二分查找,找到返回true
注意:序列必须是非递减的(通常先排序)
去重函数 unique
unique(a.begin(), a.end()):去除相邻重复元素(只保留一个)
⚠️ 对于无序序列,需要先用 sort 排序。
vector<int> vec = {1,2,2,3,3,4,5,5};
sort(vec.begin(), vec.end());
auto last = unique(vec.begin(), vec.end());
vec.erase(last, vec.end());
sort(vec.begin(), vec.end());
auto last = unique(vec.begin(), vec.end());
vec.erase(last, vec.end());
文件操作
ifstream:从文件读取数据ofstream:向文件写入数据
#include <fstream>
ifstream infile("input.txt");
ofstream outfile("output.txt");
ifstream infile("input.txt");
ofstream outfile("output.txt");
字符串操作
count(s.begin(), s.end(), '0'):统计字符个数s.insert(pos, s2):在pos位置插入字符串s.erase(pos, len):删除从pos开始的len个字符s.substr(pos, len):截取子串s.find(s2, pos):从pos开始查找s2第一次出现的位置getline(cin, s):读取一行(包含空格)s.length():返回字符串长度reverse(s.begin(), s.end()):翻转字符串
集合 set
set<int> a:新建一个整数集合a.insert(b):插入元素a.size():集合大小a.clear():清空集合
杂学笔记
next_permutation(a, a+n):生成数组a的前n个元素的下一个排列
int a[] = {1,2,3};
do { // 输出所有排列
for(int i=0; i<3; i++) cout << a[i] << " ";
cout << endl;
} while(next_permutation(a, a+3));
do { // 输出所有排列
for(int i=0; i<3; i++) cout << a[i] << " ";
cout << endl;
} while(next_permutation(a, a+3));
DFS 深度优先搜索(模板)
// 模板一
void dfs(当前状态) {
if(到达终点) { 记录结果; return; }
for(所有可能的选择) {
if(选择合法) {
标记当前选择;
dfs(下一层状态);
撤销标记;
}
}
}
// 模板二
int search(int k) {
if(到目的地) 输出解;
else
for(int i=1; i<=算符总数; i++)
if(满足条件) {
保存结果;
search(k+1);
恢复状态; // 回溯
}
}
void dfs(当前状态) {
if(到达终点) { 记录结果; return; }
for(所有可能的选择) {
if(选择合法) {
标记当前选择;
dfs(下一层状态);
撤销标记;
}
}
}
// 模板二
int search(int k) {
if(到目的地) 输出解;
else
for(int i=1; i<=算符总数; i++)
if(满足条件) {
保存结果;
search(k+1);
恢复状态; // 回溯
}
}
BFS 广度优先搜索(模板)
// BFS 广度优先搜索模板
int bfs() {
初始化,初始状态存入队列;
队列首指针 head=0; 尾指针 tail=1;
do {
指针head后移一位,指向待扩展结点;
for(int i=1; i<=max; i++) {
if(子节点符合条件) {
tail指针增1,把新结点存入列尾;
if(新节点与原已产生节点重复) 删去该节点 (取消入队,tail减一);
else {
if(新节点是目标节点) 输出并退出;
}
}
}
} while(head < tail); // 队列为空
}
int bfs() {
初始化,初始状态存入队列;
队列首指针 head=0; 尾指针 tail=1;
do {
指针head后移一位,指向待扩展结点;
for(int i=1; i<=max; i++) {
if(子节点符合条件) {
tail指针增1,把新结点存入列尾;
if(新节点与原已产生节点重复) 删去该节点 (取消入队,tail减一);
else {
if(新节点是目标节点) 输出并退出;
}
}
}
} while(head < tail); // 队列为空
}
📋 更新日志 (2026-07-18) + BFS广度优先搜索模板
✨ 新增功能
- 新增 BFS 广度优先搜索模板:与 DFS 模板并列,提供完整的伪代码实现,便于学习和复制。
- 一键复制笔记内容:单击任意笔记条目(列表项或代码块)即可复制其核心文本内容,弹出“已复制”提示(已有功能)。
📝 内容与界面优化
- 所有笔记条目添加
data-copy属性,存储待复制文本。 - 代码块同时支持复制内部代码(不含行号)。
- 底部更新时间更新为 2026年7月18日。
- 优化移动端点击反馈,防止误触。
最后更新时间:2026年7月18日 | My Note,LTD