当前位置: 首页 > news >正文

Vector

一、基础用法

1. 头文件与命名空间

#include <vector>       // 必须包含的头文件
using namespace std;    // 可选,避免重复写 std::

2. 定义与初始化

// ① 空 vector
vector<int> v1;                  // 存储 int 的空 vector
// ② 指定大小(元素默认初始化,int 为 0,自定义类型调用默认构造)
vector<int> v2(5);               // 大小为 5 的 vector,元素均为 0
vector<string> v3(3);            // 3 个空字符串
// ③ 指定大小 + 初始值
vector<int> v4(4, 10);           // 4 个元素,均为 10 → [10,10,10,10]
// ④ 用初始化列表(C++11+)
vector<int> v5 = {1, 2, 3, 4};   // 直接初始化元素 → [1,2,3,4]
vector<int> v6{5,6,7};           // 同上(省略 =)
// ⑤ 复制初始化(拷贝另一个 vector)
vector<int> v7(v5);              // 复制 v5 的元素 → [1,2,3,4]
vector<int> v8 = v6;             // 同上
// ⑥ 范围初始化(拷贝迭代器范围内的元素)
vector<int> v9(v5.begin(), v5.end());  // 拷贝 v5 全部元素
vector<int> v10(v5.begin()+1, v5.end()-1);  // 拷贝 [2,3]

二、元素访问

vector 支持随机访问(时间复杂度 O (1)),常用访问方式:

1. 下标访问([])

vector<int> v = {10, 20, 30};
cout << v[0];  // 10(不检查越界,越界会导致未定义行为)
v[1] = 200;    // 修改元素 → [10,200,30]

2. at() 方法(带越界检查)

cout << v.at(2);  // 30(越界时抛出 out_of_range 异常,更安全)
v.at(0) = 100;    // 修改元素 → [100,200,30]

3. 访问首尾元素

cout << v.front();  // 第一个元素(100)
cout << v.back();   // 最后一个元素(30)

4. 数据指针(data())

返回指向底层数组的指针,可用于兼容 C 风格函数:

int* p = v.data();  // p 指向 v 的第一个元素
cout << p[1];       // 200(等价于 v[1])

三、添加元素

vector 动态扩容,常用添加元素的方法:

1. 尾部添加(push_back())

在 vector 末尾插入元素(平均时间复杂度 O (1)):

vector<int> v;
v.push_back(1);    // [1]
v.push_back(2);    // [1,2]
v.push_back(3);    // [1,2,3]

2. 插入元素(insert())

在指定位置插入元素(时间复杂度 O (n),需移动后续元素):

vector<int> v = {1, 2, 3};
// ① 在迭代器位置插入单个元素
v.insert(v.begin() + 1, 10);  // 在索引 1 处插入 10 → [1,10,2,3]
// ② 插入多个相同元素
v.insert(v.end(), 2, 0);      // 在末尾插入 2 个 0 → [1,10,2,3,0,0]
// ③ 插入另一个容器的范围
vector<int> temp = {4,5};
v.insert(v.begin(), temp.begin(), temp.end());  // 在开头插入 4,5 → [4,5,1,10,2,3,0,0]

3. emplace 系列(C++11+,更高效)

emplace_back() 和 emplace() 直接在容器中构造元素(避免拷贝,比 push_back/insert 更高效):

vector<pair<int, string>> vp;
// emplace_back 直接构造 pair(参数传递给构造函数)
vp.emplace_back(1, "one");  // 等价于 vp.push_back(pair<int,string>(1, "one"))

四、删除元素

1. 尾部删除(pop_back())

删除最后一个元素(时间复杂度 O (1)):

vector<int> v = {1,2,3};
v.pop_back();  // 删除 3 → [1,2]

2. 指定位置删除(erase())

删除迭代器指向的元素,或范围元素(时间复杂度 O (n)):

vector<int> v = {1,2,3,4,5};
// ① 删除单个元素(迭代器位置)
v.erase(v.begin() + 2);  // 删除索引 2 的元素(3)→ [1,2,4,5]
// ② 删除范围元素([begin, end))
v.erase(v.begin(), v.begin() + 2);  // 删除前 2 个元素 → [4,5]

3. 清空所有元素(clear())

删除所有元素(大小变为 0,但容量可能保留):

v.clear();  // 元素清空,size() 为 0,capacity() 不变

五、容量与大小管理

vector 有两个关键属性:
size():当前元素个数。
capacity():当前可容纳的最大元素个数(底层数组大小)。

1. 查看大小与容量

vector<int> v = {1,2,3};
cout << v.size();      // 3(元素个数)
cout << v.capacity();  // 至少为 3(取决于实现,可能更大)

2. 调整大小(resize())

改变元素个数(若增大,新增元素默认初始化或指定值):

v.resize(5);       // 大小变为 5,新增元素为 0 → [1,2,3,0,0]
v.resize(2);       // 大小变为 2,删除后面的元素 → [1,2]
v.resize(4, 10);   // 大小变为 4,新增元素为 10 → [1,2,10,10]

3. 预留容量(reserve())

提前分配底层内存(避免频繁扩容,提升性能):

vector<int> v;
v.reserve(100);  // 容量至少为 100(size() 仍为 0)
// 后续添加 100 个元素时,不会触发扩容

4. 收缩容量(shrink_to_fit(),C++11+)

将容量缩减至与大小一致(释放多余内存):

vector<int> v(100);
v.resize(10);
v.shrink_to_fit();  // capacity() 变为 10

六、遍历 vector

1. 下标遍历

for (int i = 0; i < v.size(); ++i) {cout << v[i] << " ";
}

2. 迭代器遍历

// 正向迭代器
for (vector<int>::iterator it = v.begin(); it != v.end(); ++it) {cout << *it << " ";
}
// 反向迭代器(从后往前)
for (vector<int>::reverse_iterator rit = v.rbegin(); rit != v.rend(); ++rit) {cout << *rit << " ";
}

3. 范围 for 循环(C++11+,推荐)

for (int num : v) {  // 只读遍历cout << num << " ";
}
for (int& num : v) {  // 引用遍历(可修改元素)num *= 2;
}

七、其他常用操作

1. 交换两个 vector(swap())

交换两个 vector 的元素(时间复杂度 O (1),仅交换底层指针):

vector<int> v1 = {1,2};
vector<int> v2 = {3,4,5};
v1.swap(v2);  // v1 变为 {3,4,5},v2 变为 {1,2}

2. 检查是否为空(empty())

if (v.empty()) {cout << "vector is empty";
}

3. 排序(配合

#include <algorithm>
vector<int> v = {3,1,4};
sort(v.begin(), v.end());  // 升序 → [1,3,4]
sort(v.rbegin(), v.rend());  // 降序 → [4,3,1]
http://www.hskmm.com/?act=detail&tid=20047

相关文章:

  • SSM
  • Mybatis Plus
  • 0927模拟赛总结
  • AT_agc010_b [AGC010B] Boxes
  • Selenium自动化脚本总报错?这7个调试技巧帮你解决90%问题
  • C语言 - *进制转*进制 3
  • ThreadLocal详解
  • C语言 - *进制转*进制 2
  • Functions
  • QOJ #5421. Factories Once More 题解
  • 自动生成验证码
  • 9.23 总结
  • 新品团购 V3 小程序:助力商家高效拓客与直播带货的全能解决方案
  • 事倍功半是蠢蛋56 写业务不要有预设心态
  • 365 赚钱宝小程序系统:多元化变现与趣味运营一体的小程序解决方案
  • 9.22 总结
  • Ansible实现自动化运维 - 实践
  • 每天30道四则运算题目(随机数习题)
  • capsWriter-offline可否支持更小声音输入调研-opus4.1答复
  • git 版本控制
  • 读书笔记:字符与二进制字符串类型详解
  • 析构——循环引用
  • 一些树上问题
  • 如何用 ShedLock 让 Spring Boot 的定时任务在多实例环境下只执行一次
  • 故障处理:Oracle表空间异常增长后又恢复正常的故障模拟与分析
  • Oracle故障分析:lsnrctl start启动监听很慢(AIX平台)
  • 第十届新能源系统、电气与电力国际学术会议 (NESEP 2025)
  • 数据结构 - 二叉树的非递归方式遍历
  • 1208. 翻硬币
  • C# Avalonia 15- Animation- CachingTest