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

C++ STL入门:vecto容器

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


一、vector 容器核心特性

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

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

二、容器初始化与容量管理
1. 构造方式对比
    // 默认构造:空容器vector<int> v1; // 指定大小构造(元素默认初始化)vector<int> v2(10); // 指定大小+初始值构造vector<int> v3(10, 2); // 10个值为2的元素// 迭代器区间构造(可用于复制其他容器)vector<int> v4(v3.begin(), v3.end());
2. 容量操作函数
    v.resize(10);  // 调整元素数量:若增大则填充默认值cout << "当前元素数:" << v.size() << endl; // 输出10cout << "当前存储容量:" << v.capacity() << endl; // 容量≥size()v.reserve(20); // 显式预留存储空间(避免多次扩容)

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


三、元素访问与修改
1. 下标访问 vs 迭代器访问
    // 下标赋值for(int i=0; i<10; i++) {v[i] = i+1; // 支持[]运算符随机访问}// 迭代器遍历(STL标准方式)for(auto it = v.begin(); it != v.end(); ++it) {cout << *it << " "; // 解引用访问元素}
2. 尾部插入操作
    v.push_back(11); // 尾插新元素cout << "扩容后元素数:" << v.size() << endl; // 输出11cout << "扩容后存储容量:" << v.capacity() << endl; // 可能输出20
3. 边界安全访问
    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. 动态数据存储
vector<int> nums;
int input;
while(cin >> input) {nums.push_back(input);  // 自动扩展存储空间
}
2. 算法中间结果保存
// 寻找数组中消失的数字(LeetCode 448)
vector<int> findDisappearedNumbers(vector<int>& nums) {vector<int> result;// 算法实现...return result;
}
3. 二维矩阵构造
int m = 3, n = 4;
vector<vector<int>> matrix(m, vector<int>(n, 0)); // 创建3×4矩阵

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

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

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

http://www.xdnf.cn/news/4712.html

相关文章:

  • 四川安全员考试的内容包括哪些?
  • 2025年微服务架构关键知识点(一):核心原则与演进趋势
  • Web 架构之高可用基础
  • 基于FPGA的血氧和心率蓝牙监测系统设计-max30102
  • SHA系列算法
  • 秋招准备——2.跨时钟相关
  • 大疆无人机(全系列,包括mini)拉流至电脑,实现直播
  • 机器学习第一讲:机器学习本质:让机器通过数据自动寻找规律
  • SpringCloud服务拆分:Nacos服务注册中心 + LoadBalancer服务负载均衡使用
  • 使用C# ASP.NET创建一个可以由服务端推送信息至客户端的WEB应用(2)
  • 视频编解码学习六之视频采集和存储
  • Linux环境下部署MaxScale
  • 安卓基础(静态方法)
  • 企业级可观测性实现:OpenObserve云原生平台的本地化部署与远程访问解析
  • DeepSeek+即梦AI实战:图片制作教程
  • 电机的控制字和状态字各个位在各个模式下的含义
  • Maven使用教程
  • flutter利用 injectable和injectable_generator 自动get_it注册
  • 最新阿里九宫格识别模型,连线,231 协议算法
  • 【Python从入门到精通】--‘@‘符号的作用
  • 架空输电线巡检机器人轨迹优化设计
  • 探索网络设备安全:Shodan 的原理与合法应用
  • Early clock flow
  • web 自动化之 selenium+webdriver 环境搭建及原理讲解
  • 图书推荐(协同过滤)算法的实现:基于订单购买实现相似用户的图书推荐
  • Python在自动驾驶实时数据处理中的应用:让AI驾驶更智能、更高效
  • 算法题(142):木材加工
  • .NET中使用HTTPS全解析
  • k8s术语之Horizontal Pod Autoscaling
  • 学习设计模式《八》——原型模式