C++动态数组vector全面解析
一、上期回顾
掌握了 C++ STLstring字符串类的构造、赋值、遍历、常用接口、与 C 字符数组互转。今天开始学习STL 最常用动态数组:vector。
二、vector 是什么
vector是动态数组:
- 底层还是连续内存,和普通数组一样支持随机访问
- 自动扩容,不用手动关心大小
- 封装了增删改查全套接口,比原生数组安全好用
三、vector 相比于普通数组优势
- 普通数组:固定长度,容易越界、栈溢出
- vector:动态自动扩容,空间灵活
- 支持直接赋值、拷贝、整体初始化
- 自带大小、容量、清空、插入删除接口
- 可以作为函数返回值,不用手动管理内存
四、vector 常用构造方式
#include <iostream> #include <vector> using namespace std; int main() { // 1. 空容器 vector<int> v1; // 2. n个初始化为0 vector<int> v2(5); // 3. n个相同值 vector<int> v3(5, 10); // 4. 拷贝构造 vector<int> v4(v3); // 5. 数组区间构造 int arr[] = {1,2,3,4}; vector<int> v5(arr, arr+4); return 0; }五、vector 常用赋值方式
vector<int> v1 = {1,2,3}; vector<int> v2; // 1. 直接赋值 v2 = v1; // 2. assign 赋值 v2.assign(3, 66); // 3. 区间赋值 v2.assign(v1.begin(), v1.end());六、vector 遍历三种方式
vector<int> v = {10,20,30,40}; // 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 << " "; } // 3. C++11 范围for for(auto val : v) { cout << val << " "; }七、vector 核心接口必背
vector<int> v; // 尾部插入 v.push_back(10); // 尾部删除 v.pop_back(); // 获取元素个数 v.size(); // 获取容量 v.capacity(); // 判断是否为空 v.empty(); // 清空元素 v.clear(); // 指定位置插入 v.insert(v.begin(), 99); // 指定位置删除 v.erase(v.begin()); // 预留空间,减少扩容 v.reserve(100); // 重置大小 v.resize(10);八、size 与 capacity 区别(面试常问)
- size:当前实际元素个数
- capacity:已经分配的内存容量
- 当
size == capacity再插入元素,vector自动扩容
九、vector 扩容机制原理
- vector 底层连续内存,满了不能原地扩展
- 重新开辟一块更大内存
- 把旧元素拷贝到新空间
- 释放旧内存
- 指向新空间
一般扩容规则:
- 2 倍 或 1.5 倍 扩容(不同编译器略有差异)
- 提前用
reserve()预留空间,可避免多次扩容,提升效率
十、完整综合示例代码
#include <iostream> #include <vector> using namespace std; int main() { vector<int> v; // 尾插元素 v.push_back(1); v.push_back(2); v.push_back(3); cout << "元素遍历:"; for(auto val : v) { cout << val << " "; } cout << endl; cout << "size:" << v.size() << endl; cout << "capacity:" << v.capacity() << endl; // 头部插入 v.insert(v.begin(), 99); cout << "插入后第一个元素:" << v[0] << endl; // 清空 v.clear(); cout << "清空后size:" << v.size() << endl; return 0; }十一、今日核心总结
- vector 是动态连续数组,替代原生数组首选
- size 实际元素数,capacity 已分配容量
- 三种遍历:下标、迭代器、范围 for
- 常用操作:push_back、pop_back、insert、erase、clear
- 提前 reserve 预留空间,减少自动扩容开销
十二、课后练习
- 创建 vector 存入 1~10,遍历打印
- 在第 2 个位置插入数值 66
- 删除最后一个元素,观察 size 变化
