一、vector 动态数组
1. 容器简介
vector 是连续内存的动态数组,完美替代原生固定长度数组:
- 原生数组:长度固定、容易栈溢出、空间浪费
- vector:自动动态扩容、尾部增删高效、支持下标随机访问、自动内存管理
适合存储一组同类型数据,长度不确定的场景
2. 头文件 & 初始化
#include <vector>
using namespace std;
// 四种常用初始化
vector<int> v; // 空容器
vector<int> v1(10); // 10个元素,默认初始值 0
vector<int> v2(5, 8); // 5个元素,全部初始化为 8
vector<int> v3 = {1,2,3}; // 直接列表初始化
3. 核心常用 API
v.push_back(x); // 尾部插入元素(最常用)
v.pop_back(); // 删除尾部元素
v.size(); // 返回元素个数,返回值size_t
v.empty(); // 判断容器是否为空,空返回true
v.clear(); // 清空所有元素
v[i]; // 下标随机访问,和普通数组一致
v.begin(); // 首元素迭代器
v.end(); // 末尾后一位迭代器
4. 遍历方式
// 1. 下标遍历
for(int i = 0; i < v.size(); i++)
cout << v[i] << " ";
// 2. 范围for遍历
for(int x : v)
cout << x << " ";
5. 优缺点 & 适用场景
✅ 优点:内存连续、随机访问 O (1)、尾部增删极快、自动扩容、使用简单
❌ 缺点:中间 / 头部插入删除效率低,需要挪动元素
💡 适用:普通数组替代、不确定数据量存储、排序、双指针、模拟类题目
二、C++ 二维数组
做题两种写法:静态二维数组 /vector 二维数组
1. 静态二维数组
固定最大范围,适合 n,m ≤ 50/100 题目
// 全局定义
const int N = 55;
int a[N][N];
- 下标:
a[i][j]第 i 行第 j 列 - 适合:棋盘、网格、01 矩阵、图论邻接矩阵
2. vector 动态二维数组
长度不固定,适配任意输入规模
vector<vector<int>> g(n, vector<int>(m));
3. 二维数组遍历模板
// n行m列
for(int i = 0; i < n; i++)
{
for(int j = 0; j < m; j++)
{
// 操作 a[i][j]
}
}
三、string 字符串容器
1. 简介
string 是 STL 字符容器,完全替代 C 语言 char[]:长度动态、支持直接拼接、比较、截取,处理字符串 / 01 矩阵。
2. 头文件 & 初始化
#include <string>
string s;
string s1 = "abc123";
string s2(s1);
3. 常用函数
s.size(); // 字符串长度
s.empty(); // 判断空串
s.clear(); // 清空
s += "xxx"; // 直接拼接
s.substr(pos,len);// 截取子串(起始位置,长度)
s.find("ab"); // 查找子串
s[i]; // 下标取字符
4. 经典用法(矩阵读入)
// 用到的 01 网格读入
string s;
cin >> s;
for(int j = 0; j < m; j++)
a[i][j] = s[j] - '0';
四、万能 sort 排序(STL)
1. 基础头文件
#include <algorithm>
2. 一维数组 /vector 排序
默认:升序(从小到大)
vector<int> v = {5,2,9,1};
sort(v.begin(), v.end());
降序(从大到小)
sort(v.begin(), v.end(), greater<int>());
3. 普通数组排序
int arr[10] = {3,1,4,2};
sort(arr, arr + 4);
4. string 字符串排序
按字典序排序
string s = "dcba";
sort(s.begin(), s.end());
cout << s; // abcd
五、常见易错点
1.大数组尽量全局定义,防止栈溢出;
- 函数内部(main 里)定义的局部变量、数组,存在栈区,空间很小;一旦定义二维大数组,容易超出栈上限,造成栈溢出。
- 写在所有函数外的全局数组,存储在大容量全局区,空间充足,不会爆内存。
2.size() 为无符号类型,避免负数运算;
size() 是无符号类型,严禁负数运算
vector.size() / string.size() 返回值是 size_t,属于无符号整型。无符号数永远 ≥ 0,一旦出现减法负数,会发生数值下溢,变成超大正数,直接死循环 / 越界报错。
// 方式1:强转 int
for(int i = 0; i < (int)v.size() - 1; i++)
// 方式2:先用int接收
int len = v.size();
for(int i = 0; i < len - 1; i++)
3.sort 是左闭右开区间,只写到末尾迭代器;
STL 所有算法统一规则:左闭右开
sort(l, r)- 包含左端点
l - 不包含右端点
r
int a[5] = {3,1,4,2,5};
// 排前 4 个:a[0]~a[3],右端点写 a+4
sort(a, a + 4);
4.二维网格读入,常用 string 逐行转数字存数组。
矩阵、01 网格类题目,输入都是一整行连续 0101 字符串,不能直接 cin >> a[i][j] 单个读,必须用 string 整行读取 + 转存二维数组。
6333

被折叠的 条评论
为什么被折叠?



