C++学习笔记(不定时更新)

C++头文件

#include <iostream>
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 类型 变量名 = 值;

内存拷贝函数 memcpy

  • memcpy(b, a, sizeof(a)):复制数组a的所有数据到数组b
  • memcpy(b, a, sizeof(int) * k):复制数组a的前k个元素到b
  • memcpy(b, a, sizeof(double)):复制双精度浮点数数组
  • 需要头文件:#include <cstring>

Map 容器

  • ma[ ]:访问元素,若不存在则创建并初始化为0
  • ma.size():返回元素个数
  • ma.count(element):判断元素是否存在(返回1或0)
  • ma.clear():清空map
  • ma.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;

二分查找函数

  • 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());

文件操作

  • ifstream:从文件读取数据
  • ofstream:向文件写入数据
#include <fstream>
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));

DFS 深度优先搜索(模板)

// 模板一
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); // 队列为空
}
📋 更新日志 (2026-07-18) + BFS广度优先搜索模板

✨ 新增功能

  • 新增 BFS 广度优先搜索模板:与 DFS 模板并列,提供完整的伪代码实现,便于学习和复制。
  • 一键复制笔记内容:单击任意笔记条目(列表项或代码块)即可复制其核心文本内容,弹出“已复制”提示(已有功能)。

📝 内容与界面优化

  • 所有笔记条目添加 data-copy 属性,存储待复制文本。
  • 代码块同时支持复制内部代码(不含行号)。
  • 底部更新时间更新为 2026年7月18日
  • 优化移动端点击反馈,防止误触。

最后更新时间:2026年7月18日 | My Note,LTD

✅ 已复制