1. 从零开始理解STL vector
第一次接触C++标准模板库(STL)时,vector给我的感觉就像是一个会"自动扩容"的数组。但真正深入使用后才发现,它的设计哲学远比这复杂得多。作为STL中最基础也最常用的容器,vector完美体现了C++"零开销抽象"的设计理念——既提供了高级的接口便利性,又保持了与原生数组相近的性能表现。
在实际项目中,vector几乎无处不在:从存储用户输入数据、管理游戏对象列表,到作为算法处理的中间容器。它的动态扩容特性让我们无需预先知道数据规模,而连续的存储布局又保证了极高的访问效率。正是这种平衡性,使得vector成为C++开发者最值得信赖的"瑞士军刀"。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. vector核心接口全解析
2.1 基础操作三件套
vector的基础使用遵循"创建-修改-访问"的经典模式。先看一个典型示例:
cpp复制#include <vector>
#include <iostream>
int main() {
// 创建含5个元素的vector,初始值为0
std::vector<int> nums(5);
// 修改元素
nums[0] = 10;
nums.at(1) = 20;
// 访问元素
std::cout << "First element: " << nums.front() << '\n';
std::cout << "Last element: " << nums.back() << '\n';
return 0;
}
这里有几个关键点需要注意:
operator[]和at()都能访问元素,但at()会进行边界检查,越界时抛出std::out_of_range异常front()和back()分别返回首尾元素的引用,对空vector调用它们是未定义行为- 初始化时指定大小会调用元素的默认构造函数(内置类型零初始化)
2.2 动态扩容的奥秘
vector最强大的特性莫过于自动扩容。当插入元素导致容量不足时,vector会自动申请更大的内存(通常是当前容量的1.5或2倍),迁移数据并释放旧内存。这个过程对使用者完全透明:
cpp复制std::vector<int> v;
std::cout << "Initial capacity: " << v.capacity() << '\n';
for(int i=0; i<100; ++i) {
v.push_back(i);
if(v.capacity() != old_cap) {
std::cout << "Capacity changed to: " << v.capacity() << '\n";
}
}
重要提示:频繁扩容会导致性能下降。如果预先知道元素数量,应该使用
reserve()提前分配足够空间。
2.3 迭代器与算法配合
vector的迭代器是随机访问迭代器,可以与STL算法完美配合:
cpp复制std::vector<int> data = {5, 3, 8, 1, 9};
// 排序
std::sort(data.begin(), data.end());
// 查找
auto it = std::find(data.begin(), data.end(), 8);
if(it != data.end()) {
std::cout << "Found at position: " << it - data.begin() << '\n';
}
// 遍历(C++11起)
for(int num : data) {
std::cout << num << ' ';
}
迭代器失效是使用vector时需要特别注意的问题。任何可能导致vector重新分配内存的操作(如push_back当size==capacity时),都会使所有迭代器、引用和指针失效。
3. 手把手实现简易vector
3.1 基础框架搭建
我们先定义vector类的骨架:
cpp复制template<typename T>
class Vector {
public:
// 类型别名
using iterator = T*;
using const_iterator = const T*;
// 构造/析构
Vector();
explicit Vector(size_t n, const T& val = T());
~Vector();
// 容量相关
size_t size() const;
size_t capacity() const;
bool empty() const;
void reserve(size_t new_cap);
// 元素访问
T& operator[](size_t pos);
const T& operator[](size_t pos) const;
T& front();
const T& front() const;
T& back();
const T& back() const;
// 修改操作
void push_back(const T& value);
void pop_back();
void clear();
// 迭代器
iterator begin();
iterator end();
const_iterator begin() const;
const_iterator end() const;
private:
T* m_data; // 数据存储指针
size_t m_size; // 当前元素数量
size_t m_capacity; // 当前容量
};
3.2 内存管理实现
vector的核心在于内存管理,我们重点实现构造、析构和扩容:
cpp复制// 默认构造
template<typename T>
Vector<T>::Vector() :
