1,顺序表;2,单链表;3,双向链表;4,循环链表;5,静态链表;
登录以参加训练计划
1.Vector
一、什么是vector?
vector
是C++标准模板库(STL)中的动态数组,具备以下特性:
- 动态扩容:无需预定义长度,可随时增减元素
- 高效访问:支持下标随机访问(时间复杂度O(1))
- 丰富接口:内置排序、插入删除等功能
典型应用场景:
- 算法题中的临时数据存储
- 未知长度的输入处理
- 实现栈/队列等数据结构
二、基础操作
1. 定义与初始化
#include <vector>
using namespace std;
vector<int> v1; // 空vector → []
vector<double> v2(5); // 含5个0.0 → [0.0,0.0,0.0,0.0,0.0]
vector<string> v3{"苹果", "香蕉"}; // 列表初始化 → ["苹果","香蕉"]
2.添加元素
v1.push_back(10); // 尾部插入
v1.insert(v1.begin()+1, 20); // 索引1插入 [10,20]
3.删除元素
v1.pop_back(); // 删除末尾 → [10]
v1.erase(v1.begin()+x); // 删除指定位置元素,注意是索引 → []
v1.clear(); // 清空所有元素
4.访问元素
int x = v3[0]; // 直接访问(不越界检查) → "苹果"
string y = v3.at(1); // 安全访问(越界抛异常) → "香蕉"
5.反转元素
//反转,注意是前闭后开区间。
for(int i=1; i<=m; i++) {
cin>>x>>y;
reverse(v.begin()+x-1,v.begin()+y);
}
6.条件删除1
vector<int> vec = {1, 2, 3, 2, 5};
vec.erase(remove(vec.begin(), vec.end(), 2), vec.end()); // 删除所有2 → {1, 3, 5}
7.条件删除2
vector<int> vec = {1, 2, 3, 2, 5};
vec.erase(remove_if(vec.begin(), vec.end(), [](int x) { return x % 2 == 0; }), vec.end());
// 删除所有偶数 → {1, 3, 5}
三、核心成员函数
函数 | 作用 | 示例 |
---|---|---|
size() |
返回元素个数 | v2.size() → 5 |
empty() |
判断是否为空 | v1.empty() → true |
front() |
获取首元素 | v3.front() → "苹果" |
back() |
获取末元素 | v3.back() → "香蕉" |
resize(n) |
调整大小为n(默认填充) | v2.resize(3) → [0,0,0] |
四、实战技巧
1. 遍历方式
// 下标遍历(推荐新手)
for(int i=0; i<v.size(); ++i) {
cout << v[i] << " ";
}
// 迭代器遍历(更通用)
for(auto it=v.begin(); it!=v.end(); ++it){
cout << *it << " ";
}
2. 快速排序
#include <algorithm>
sort(v.begin(), v.end()); // 升序
sort(v.rbegin(), v.rend()); // 降序
3.二维表格
3.1完全动态的二维表格:vector<vector> v
vector<vector<int>> v;
v.push_back({1,2,3}); // 添加一行数据
v[0].push_back(4); // 修改第一行
3.2混合初始化方式:混合初始化方式
指定行与列并赋值:
vector<vector<int>> matrix(3, vector<int>(4)); // 3行4列
matrix[1][2] = 5; // 第二行第三列赋值
预分配行数,并初始化列:
vector<vector<int>> v(5, vector<int>(3, 0)); // 5行3列,初始值为0
从现有数据构造:
vector<vector<int>> v = {{1,2}, {3,4}, {5,6}}; // 直接初始化3行2列
3.3固定行数,动态列数方式:
vector<int> v[5]; // 定义行数为5的二维数组,每行可动态添加元素
v[0].push_back(1); // 第一行添加元素1
v[1].resize(3); // 第二行固定为3列
3.4不同定义方式的区别:
定义方式 | 行是否固定 | 列是否动态 | 内存管理 | 适用场景 |
---|---|---|---|---|
vector<int> v[N] |
是(固定行数) | 是 | 自动释放每行内存 | 已知行数,列数变化(如邻接表) |
vector<vector<int>> v |
否 | 完全自动 | 行、列均可能变化(如稀疏矩阵) | |
vector<vector<int>> v(n,m) |
是(固定行数) | 是(固定列数) | 自动 | 需要预分配固定行列的二维结构 |
int **arr |
否 | 需手动释放 | 需极高性能,但牺牲安全性 |
五、常见错误处理
越界访问 使用at()代替[],或先检查i < v.size() 忘记清空 多组数据输入时,循环前执行v.clear() 迭代器失效 插入/删除后重新获取迭代器
- 参加人数
- 0
- 创建人