目录
一、头文件管理
1.1 万能头文件(快捷方式)
1.2 标准头文件规范
二、输入输出处理
2.1 基本输入方式
2.2 格式化输出
三、常用 API 详解
3.2 容器操作
Vector(动态数组)
Stack/Queue
3.3 排序与自定义规则
3.4 哈希容器
unordered_map
set
四、实践建议
完整导图内容可见博主主页 gitee,关于oj常用的一些算法模板的导图 还差一点才画完,之后看情况,可能会整理一下也贴过来叭
一、头文件管理
1.1 万能头文件(快捷方式)
#include <bits/stdc++.h> // GCC 扩展头文件(非标准)
using namespace std; // 启用标准命名空间(包含 cin/cout)
注意事项:
- 仅适用于小型程序/竞赛场景,正式项目推荐显式包含所需头文件(如
<iostream>
<vector>
) - 使用
using namespace std
可能造成命名污染,大型项目建议显式调用(如std::cout
)
1.2 标准头文件规范
类型 | 示例 | 说明 |
C++ 标准库 |
| 输入输出流 |
C 标准库兼容版 |
| 数学函数 |
容器类 |
| 动态数组/队列等容器 |
算法类 |
| 排序、查找等算法 |
(更多头文件分类参考微软官方文档 )
二、输入输出处理
2.1 基本输入方式
int num;
string str;
char arr[20];cin >> num; // 读取到空格/回车停止
getline(cin, str); // 读取整行(含空格)
cin.getline(arr, 20); // 读取到 char 数组
2.2 格式化输出
double sum = 1.664;
printf("sum is %06.2lf", sum); // 输出:sum is 001.66// 格式说明符:
// %s(string), %c(char), %d(int)
// %f(float), %lf(double)
三、常用 API 详解
3.1 字符串操作(<string>
)
string s = "Hello";s.push_back('!'); // 尾部插入字符
s.insert(s.begin()+3,'X'); // 指定位置插入
s.erase(2, 3); // 删除从索引2开始的3个字符
s.substr(0,4); // 截取子串 -> "Hell"
transform(s.begin(), s.end(), s.begin(), ::toupper); // 全转大写
3.2 容器操作
Vector(动态数组)
vector<int> arr {3,1,4};
sort(arr.begin(), arr.end()); // 排序 [1,3,4]
reverse(arr.begin(), arr.end()); // 反转 [4,3,1]
arr.erase(arr.begin()+1); // 删除第二个元素
Stack/Queue
stack<int> s;
s.push(10); // 入栈
cout << s.top(); // 查看栈顶queue<string> q;
q.push("task1"); // 入队
q.pop(); // 出队
3.3 排序与自定义规则
// 结构体排序
struct Node { int val; };
bool compare(Node a, Node b) {return a.val > b.val; // 降序排列
}// 字符串字典逆序
sort(s.begin(), s.end(), [](char a, char b){return a > b;
});
3.4 哈希容器
unordered_map
unordered_map<int, string> map;
map[1] = "Tom"; // 插入键值对
if(map.find(1) != map.end()) { // 查找元素cout << map.at(1); // 安全访问
}
set
set<int> uniqueNums;
uniqueNums.insert(5); // 自动去重
if(uniqueNums.count(5)) { // 存在性检查uniqueNums.erase(5);
}
四、实践建议
- 头文件管理:大型项目使用
#pragma once
防止重复包含 - 内存安全:vector 替代原始数组,避免越界访问
- 性能优化:优先使用
emplace_back()
替代push_back()
减少拷贝 - 代码规范:复杂排序规则 建议使用 lambda 表达式保持代码简洁
这两点的使用可看下一篇的sum