C++ STL 容器详解:vector 与 string + sort排序

一、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 整行读取 + 转存二维数组

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值