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() 迭代器失效 插入/删除后重新获取迭代器

章节 1. 新手

开放

题目 尝试 AC 难度
P1  【例2.1】Hello World 362 91 1

章节 2. 师傅

开放

题目 尝试 AC 难度
P1  【例2.1】Hello World 362 91 1

章节 3. 大神

开放

题目 尝试 AC 难度
P1  【例2.1】Hello World 362 91 1
 
参加人数
0
创建人