C++ STL入门:vecto容器

C++ STL 系列入门:vector 动态数组


一、vector 容器核心特性

vector 是 C++ 标准库提供的动态数组容器,具有以下显著优势:

  • 自动扩容机制:当插入元素超出当前容量时,自动申请新内存并迁移数据
  • 随机访问效率:支持 O(1) 时间复杂度的下标访问
  • 与原生数组兼容:通过 data() 方法可获取指向底层存储的指针
cpp 复制代码
#include <iostream>
#include <vector>
using namespace std;

int main() {
    // 基础操作演示
    vector<int> v;

二、容器初始化与容量管理
1. 构造方式对比
cpp 复制代码
    // 默认构造:空容器
    vector<int> v1; 

    // 指定大小构造(元素默认初始化)
    vector<int> v2(10); 

    // 指定大小+初始值构造
    vector<int> v3(10, 2); // 10个值为2的元素

    // 迭代器区间构造(可用于复制其他容器)
    vector<int> v4(v3.begin(), v3.end());
2. 容量操作函数
cpp 复制代码
    v.resize(10);  // 调整元素数量:若增大则填充默认值
    cout << "当前元素数:" << v.size() << endl; // 输出10
    cout << "当前存储容量:" << v.capacity() << endl; // 容量≥size()

    v.reserve(20); // 显式预留存储空间(避免多次扩容)

扩容机制解析

当未显式预留空间时,vector 扩容策略通常是当前容量的两倍。例如初始容量5,push_back第6个元素时,容器会重新分配10个元素的内存空间。


三、元素访问与修改
1. 下标访问 vs 迭代器访问
cpp 复制代码
    // 下标赋值
    for(int i=0; i<10; i++) {
        v[i] = i+1; // 支持[]运算符随机访问
    }

    // 迭代器遍历(STL标准方式)
    for(auto it = v.begin(); it != v.end(); ++it) {
        cout << *it << " "; // 解引用访问元素
    }
2. 尾部插入操作
cpp 复制代码
    v.push_back(11); // 尾插新元素
    cout << "扩容后元素数:" << v.size() << endl; // 输出11
    cout << "扩容后存储容量:" << v.capacity() << endl; // 可能输出20
3. 边界安全访问
cpp 复制代码
    if(!v.empty()) {
        cout << "首元素:" << v.front() << endl; // front()
        cout << "末元素:" << v.back() << endl;   // back()
    }

四、常见操作时间复杂度分析
操作 时间复杂度 特性说明
push_back() 摊销 O(1) 扩容时 O(n)
pop_back() O(1) 仅移除不减小容量
insert() O(n) 中间插入需移动元素
erase() O(n) 删除后需收缩元素
operator[] O(1) 无边界检查
at() O(1) 带边界检查抛出异常

五、典型应用场景
1. 动态数据存储
cpp 复制代码
vector<int> nums;
int input;
while(cin >> input) {
    nums.push_back(input);  // 自动扩展存储空间
}
2. 算法中间结果保存
cpp 复制代码
// 寻找数组中消失的数字(LeetCode 448)
vector<int> findDisappearedNumbers(vector<int>& nums) {
    vector<int> result;
    // 算法实现...
    return result;
}
3. 二维矩阵构造
cpp 复制代码
int m = 3, n = 4;
vector<vector<int>> matrix(m, vector<int>(n, 0)); // 创建3×4矩阵

六、易错点与优化建议
  1. 迭代器失效问题
cpp 复制代码
auto it = v.begin();
v.push_back(100); // 可能触发扩容,导致it失效!
// 正确做法:先执行插入操作再获取迭代器
  1. 避免频繁扩容
cpp 复制代码
vector<int> data;
data.reserve(1000); // 预留空间提升性能
for(int i=0; i<1000; i++) {
    data.push_back(i);
}
  1. 空间释放陷阱
cpp 复制代码
vector<int>(v).swap(v); // 缩小至实际大小

七、延伸知识点
  • shrink_to_fit():请求删除未使用容量(C++11)
  • emplace_back():原地构造元素(避免拷贝)
  • data() 方法:获取底层数据指针用于接口交互

配套练习项目
LeetCode 数组系列题目
CppReference vector文档

相关推荐
Wyc7240922 分钟前
JDBC:java与数据库连接,Maven,MyBatis
java·开发语言·数据库
强化学习与机器人控制仿真25 分钟前
Newton GPU 机器人仿真器入门教程(零)— NVIDIA、DeepMind、Disney 联合推出
开发语言·人工智能·python·stm32·深度学习·机器人·自动驾驶
芯片SIPI设计1 小时前
MIPI C-PHY 标准学习----一种通用多信号传输方案
c语言·开发语言·学习
Tiny番茄1 小时前
No module named ‘xxx’报错原因及解决方式
开发语言·python
咩咩觉主1 小时前
c#数据结构 线性表篇 非常用线性集合总结
开发语言·数据结构·unity·c#·游戏引擎·程序框架
Darkwanderor2 小时前
c++STL-string的模拟实现
c++·string
南风与鱼2 小时前
【数据结构】红黑树(C++)
c++·红黑树
李匠20242 小时前
C++GO语言微服务和服务发现②
开发语言·c++·golang·服务发现
每次的天空2 小时前
Kotlin 内联函数深度解析:从源码到实践优化
android·开发语言·kotlin
268572592 小时前
JVM 监控
java·开发语言·jvm