1. Vector基础概念与核心设计
在C++标准模板库(STL)中,vector是最常用的动态数组容器之一。作为一名长期使用C++进行开发的工程师,我经常需要向团队新人解释vector的内部机制。理解vector的底层实现不仅能帮助我们更高效地使用它,还能在性能优化时做出更明智的决策。
vector本质上是一个动态分配的数组,它通过三个关键指针来管理内存:
_start:指向数组首元素的指针_finish:指向最后一个元素的下一个位置(即当前有效元素末尾)_endofstorage:指向已分配内存空间的末尾
这种设计使得vector能够:
- 在O(1)时间内访问任意元素(随机访问)
- 在尾部高效地添加/删除元素(平均O(1)时间)
- 自动管理内存分配和释放
提示:vector的迭代器本质就是原生指针,这也是为什么vector的遍历效率如此之高。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. Vector的构造与初始化
2.1 构造函数实现解析
vector提供了多种构造函数来满足不同场景的需求:
cpp复制// 无参构造 - 创建空vector
vector()
:_start(nullptr)
, _finish(nullptr)
, _endofstorage(nullptr)
{}
// 拷贝构造 - 深拷贝另一个vector
vector(const vector<T>& v)
:_start(nullptr)
, _finish(nullptr)
, _endofstorage(nullptr)
{
vector tmp(v.begin(), v.end());
swap(tmp);
}
// 初始化n个val - 创建包含n个相同元素的vector
vector(size_t n, const T& val = T())
:_start(nullptr)
, _finish(nullptr)
, _endofstorage(nullptr)
{
reserve(n);
for (size_t i = 0; i < n; ++i) {
push_back(val);
}
}
// 迭代器范围构造 - 用其他容器的元素初始化vector
template <class InputIterator>
vector(InputIterator first, InputIterator last)
:_start(nullptr)
, _finish(nullptr)
, _endofstorage(nullptr)
{
while (first != last) {
push_back(*first);
++first;
}
}
在实际工程中,我特别推荐使用拷贝构造时采用的"拷贝+交换"技术。这种方法不仅代码简洁,而且异常安全。具体来说:
- 先创建一个临时vector(tmp)
- 将tmp与当前
