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 类型 变量名 = 值; // 格式

内存拷贝函数 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<KeyType, ValueType>::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(first, last):去除相邻重复元素(只保留一个),通常先 sort
sort(first, last); // 先排序
auto new_end = unique(first, last);
container.erase(new_end, last); // 删除重复元素

文件操作

  • ifstream:从文件读取数据
  • ofstream:向文件写入数据
#include <fstream>
ifstream infile("文件名");
ofstream outfile("文件名");

字符串操作

  • 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(first, last):生成下一个排列(按字典序)
do {
    // 处理当前排列
} while(next_permutation(first, last));

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); // 队列为空
}

栈 stack

  • stack<数据类型> 栈名;:声明一个栈
  • push(x):将 x 压入栈顶,时间复杂度 O(1)
  • top():获取栈顶元素,时间复杂度 O(1)
  • pop():弹出栈顶元素(无返回值),时间复杂度 O(1)
  • empty():检测栈是否为空,空返回 true,否则 false,时间复杂度 O(1)
  • size():返回栈内元素个数,时间复杂度 O(1)
stack<数据类型> 栈名; // 声明
栈名.push(元素);
元素 = 栈名.top(); // 取栈顶
栈名.pop(); // 弹出
if(!栈名.empty()) {
    cout << 栈名.size();
}

队列 queue

  • queue<数据类型> 变量名;:声明一个队列
  • empty():检测队列是否为空,空返回 true,否则 false
  • pop():出队,删除队首元素(无返回值)
  • push(val):入队,将 val 加入到队列末尾
  • front():获取队头元素,但不删除
  • back():获取队尾元素,但不删除
  • size():返回当前队列中的元素数目
queue<数据类型> 队列名; // 声明
队列名.push(元素);
元素 = 队列名.front(); // 取队首
元素 = 队列名.back(); // 取队尾
队列名.pop(); // 出队
if(!队列名.empty()) {
    cout << 队列名.size();
}
📋 更新日志 (2026-07-20) — 去除示例数据,保留纯模板

✨ 本次更新

  • 去除所有具体示例数据:所有代码块和列表项均改为通用语法模板,不再包含具体数值、文件名或具体数组初始化,便于直接复制使用。
  • 保留完整的 C++ 笔记内容:涵盖基础语法、STL 容器、常用算法、DFS/BFS 模板、stack/queue 操作等。
  • 一键复制功能:单击任意条目即可复制纯文本模板,方便粘贴到编辑器。

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

✅ 已复制