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文档

相关推荐
liangshanbo12153 小时前
JavaScript 面试题:Object.keys() 的返回顺序是无序的吗?
开发语言·javascript·ecmascript
朝朝辞暮i9 小时前
C++ 第 23 课:class —— 开始真正进入面向对象
开发语言·c++·算法
小师兄吃牛肉10 小时前
C语言篇:宏
c语言·开发语言
郑同学的笔记10 小时前
【c++随笔28】strcmp 和 memcmp对比
开发语言·c++
随意起个昵称10 小时前
【背包dp】输出方案路径
c++·动态规划
言乐611 小时前
Python根据无法识别搜索词找出可能输入内容模型
开发语言·python·django·virtualenv·pygame
weixin_3077791311 小时前
有限产能智能排产与动态重排智能体:从需求解构到技术实现
开发语言·人工智能·算法·架构
kakakahahahaha11 小时前
Windows C盘临时文件清理:%temp%、Windows Temp、Prefetch、Windows.old与hiberfil.sys处理指南
c语言·开发语言·windows
朝朝辞暮i11 小时前
C++ 第 27 课:智能指针 shared_ptr
开发语言·c++·算法
by2099911 小时前
学会使用std::string类,并理解其内部是如何管理字符串的详细阐述(上)
c++·笔记·字符串·类和对象·string