C++学习笔记

万能头文件

#include <bits/stdc++.h>
using namespace std;

Map基本操作

  • ma[ ]:访问map中的元素,若该元素不存在,将创建一个新元素并将该元素映射到值类型的初始值上(对于int类型,初始值为0)
  • ma.size():返回map中元素个数
  • ma.count(element):若元素element存在map中返回1,否则返回0
  • ma.clear():清空map
  • ma.lower_bound():返回键值大于等于给定元素的第一个位置

迭代器使用

map<string, int>::iterator it; // 声明迭代器it

// 输出键值对
cout << it->first << ":" << it->second << endl;

删除操作

  • ma.erase(it):删除it指向的元素
  • ma.erase(key):删除指定键的元素
  • ma.erase(it, ma.end()):删除从it开始到结尾的所有元素

二分查找函数

  • lower_bound(first, last, val):返回非递减序列[first, last)中第一个大于等于val的位置,如果所有元素都小于val,则返回last的位置
  • upper_bound(first, last, val):返回非递减序列[first, last)中第一个大于val的位置,如果所有元素都小于等于val,则返回last的位置
  • binary_search(first, last, val):在序列中进行二分查找,若在序列中找到值val则返回True,否则返回False

去重函数

  • unique(a.begin(), a.end()):去除相邻的重复元素(只保留一个)

    注意:对于无序序列,需要先用sort进行排序,才能正确使用此函数。

// 使用示例
vector<int> vec = {1, 2, 2, 3, 3, 3, 4, 4, 5};
// 先排序(如果无序)
sort(vec.begin(), vec.end());
// 使用unique去重
auto last = unique(vec.begin(), vec.end());
// 删除重复元素
vec.erase(last, vec.end());
// 现在vec包含: {1, 2, 3, 4, 5}

文件操作

  • ifstream:从文件读取数据
  • ofstream:向文件写入数据
// 文件读取示例
#include <fstream>
ifstream infile("input.txt");
int num;
while (infile >> num) {
    // 处理读取的数据
}
infile.close();

// 文件写入示例
ofstream outfile("output.txt");
outfile << "Hello, World!" << endl;
outfile.close();

字符串操作

  • count(s.begin(), s.end(), '0'):查找字符串中字符'0'的个数
  • s.insert(pos, s2):在s下标为pos的位置插入字符串s2
  • s.erase(pos, len):删除s中下标为pos开始的len个字符
  • s.substr(pos, len):截取s中下标为pos起的len个字符
  • s.find(s2, pos):在s中以pos位置起查找s2第一次出现的位置
  • getline(cin, s):输入字符串s(包含空格)
  • s.length():获取字符串s的长度
  • reverse(s.begin(), s.end()):翻转字符串s
// 使用示例
string s = "hello world";
string s2 = "C++";
s.insert(6, s2); // s变为 "hello C++world"
s.erase(5, 4); // 删除从下标5开始的4个字符
string sub = s.substr(0, 5); // sub = "hello"
int pos = s.find("C++", 0); // 返回第一次出现的位置
getline(cin, s); // 可以读取带空格的整行
int len = s.length();
reverse(s.begin(), s.end()); // 翻转字符串

集合操作

  • set<int> a:新建一个整数集合a
  • a.insert(b):在集合a中插入元素b
  • a.size():返回集合a的元素个数
  • a.clear():删除集合a的所有元素
// 使用示例
set<int> a;
a.insert(5);
a.insert(3);
a.insert(8);
a.insert(3); // 重复元素不会被插入
cout << "集合大小: " << a.size() << endl; // 输出 3
a.clear(); // 清空集合

杂学笔记

  • next_permutation(a, a+n):对数组a的前n个元素进行全排列(按字典序生成下一个排列)
// 使用示例
int a[] = {1, 2, 3};
int n = 3;
do {
    for(int i = 0; i < n; i++) cout << a[i] << " ";
    cout << endl;
} while(next_permutation(a, a+n));
// 输出所有排列

DFS深度优先搜索

// 模板一
void dfs(当前状态) {
    if(到达终点) { // 递归边界:找到一个解
        记录结果;
        return;
    }
    for(所有可能的选择) { // 遍历所有分支
        if(选择合法) {
            标记当前选择;
            dfs(下一层状态);
            撤销标记;
        }
    }
}

// 模板二
int search(int k) {
    if(到目的地) 输出解;
    else
        for(int i = 1; i <= 算符总数; i++)
            if(满足条件) {
                保存结果;
                search(k+1);
                恢复:保存结果之前的状态 // 回溯一步
            }
}
📋 更新日志 (2026-05-24) + 动效版本

✨ 新增动效与交互

  • 页面入场动画:整体淡入 + 轻微放大,柔和登场。
  • 卡片悬浮特效:鼠标悬停时右移、放大、加阴影,并带有光泽扫过效果。
  • 代码块呼吸光效:柔和脉冲阴影,深浅模式自适应。
  • 按钮水波纹点击效果:点击主题切换按钮出现扩散波纹。
  • 标题下划线动画:鼠标悬停章节时标题下划线平滑展开。
  • 每个笔记模块渐进上浮:错落有致的滑入效果。
  • 深色/浅色过渡:所有元素颜色、阴影切换平滑流畅。
  • 定制滚动条:更贴合主题配色。

📝 笔记内容(完整)

  • 万能头文件、Map全套操作、迭代器、删除、二分查找、去重函数。
  • 文件操作、字符串扩展操作(insert, erase, substr, find, getline, length, reverse)。
  • 集合操作、next_permutation 全排列、DFS 双模板。
  • 修正 binary_search 拼写错误,增加重要注意提示。

🎨 浅色模式全面优化(最新)

  • 重新设计浅色主题配色:柔和渐变背景、舒适文字对比、清新卡片样式。
  • 优化代码块行内背景与文字颜色,提升可读性。
  • 统一交互色为优雅蓝色(#3b82f6),悬浮光效更细腻。
  • 深浅模式切换完全跟随系统,同时保留手动按钮。

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