C++动态数组vector全面解析
·
一、上期回顾
掌握了 C++ STL string 字符串类的构造、赋值、遍历、常用接口、与 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 变化
更多推荐

所有评论(0)