635 字
3 分钟
C++下的 vector 实现
2026-06-26

复刻 C++STLvector#

实现操作:#

私有类:

  • _size
  • _capacity
  • *_data
  • _expand

公有类:

  • DynamicArray()
  • DynamicArray(size_t capacity)
  • DynamicArray(const DynamicArray &other)
  • ~DynamicArray()
  • push_back(const Elem &elem)
  • pop_back()
  • operator[]
  • operator=
  • at(size_t idx)
  • size()
  • capacity()
  • empty()
  • back()
  • front()
  • clear()
  • insert(size_t pos, const Elem &val)
  • erase(size_t pos)

代码实现#

#include <cstddef>
#include <stdexcept>
const size_t DEFAULT = 10;
template <typename Elem> class DynamicArray {
private:
size_t _size;
size_t _capacity;
Elem *_data;
void _expand() {
size_t newCapacity = (_capacity == 0) ? 1 : _capacity * 2;
Elem *data = new Elem[newCapacity];
for (size_t i = 0; i < _size; i++) {
data[i] = _data[i];
}
delete[] _data;
_data = data;
_capacity = newCapacity;
}
public:
// 构造函数
DynamicArray() : _size(0), _capacity(DEFAULT), _data(new Elem[DEFAULT]) {}
DynamicArray(size_t capacity)
: _size(0), _capacity(capacity), _data(new Elem[capacity]) {}
// 构造拷贝函数
DynamicArray(const DynamicArray &other) {
_size = other._size;
_capacity = other._capacity;
_data = new Elem[_capacity];
for (size_t i = 0; i < _size; i++)
_data[i] = other._data[i];
}
~DynamicArray() { delete[] _data; }
// 实现队尾元素的添加
void push_back(const Elem &elem) {
if (_size == _capacity)
_expand();
_data[_size] = elem;
_size++;
}
// 实现队尾元素的删除
void pop_back() {
if (_size == 0)
return;
_size--;
}
// 使用 operator 关键字,重载 [] 符号,实现对输入下标的访问
Elem &operator[](size_t idx) { return _data[idx]; }
const Elem &operator[](size_t idx) const { return _data[idx]; }
// 使用 operator 关键字,重载 = 符号,实现通过已有数组的复制操作
DynamicArray &operator=(const DynamicArray &other) {
if (this == &other)
return *this;
delete[] _data;
_size = other._size;
_capacity = other._capacity;
_data = new Elem[_capacity];
for (size_t i = 0; i < _size; i++)
_data[i] = other._data[i];
return *this;
}
// 传参引用 实现对输入下标合法性的判断
Elem &at(size_t idx) {
if (idx >= _size)
// 当出现不合法的情况下,使用 throw 抛出异常,并终止当前函数的执行
throw std::out_of_range("No that position!");
return _data[idx];
}
const Elem &at(size_t idx) const {
if (idx >= _size)
throw std::out_of_range("No that position");
return _data[idx];
}
// 返回当前元素个数
// 使用 const 来修饰隐含的传递参数
size_t size() const { return _size; }
// 返回当前的最大容量
size_t capacity() const { return _capacity; }
// 返回当前数组是否为空
bool empty() const { return _size == 0; }
// 输出一个元素
Elem &front() {
if (empty())
throw std::out_of_range("DynamicArray is Empty");
return _data[0];
}
// 适应 const
const Elem &front() const {
if (empty())
throw std::out_of_range("DynamicArray is Empty");
return _data[0];
}
// 输出一个元素
Elem &back() {
if (empty())
throw std::out_of_range("DynamicArray is Empty");
return _data[_size - 1];
}
const Elem &back() const {
if (empty())
throw std::out_of_range("DynamicArray is Empty");
return _data[_size - 1];
}
// 清空 DynamicArray 操作
void clear() { _size = 0; }
// 在指定位置插入元素
void insert(size_t pos, const Elem &val) {
if (pos > _size)
throw std::out_of_range("Illegal location");
if (_size == _capacity)
_expand();
if (pos == _size) {
push_back(val);
return;
}
for (size_t i = _size++; i > pos; i--)
_data[i] = _data[i - 1];
_data[pos] = val;
}
// 在指定位置删除元素
void erase(size_t pos) {
if (pos >= _size)
throw std::out_of_range("Illegal location");
if (pos == _size - 1) {
pop_back();
return;
}
--_size;
for (size_t i = pos; i < _size; i++)
_data[i] = _data[i + 1];
}
};
C++下的 vector 实现
https://kuchikirei.github.io/posts/vector/
作者
LINKONG
发布于
2026-06-26
许可协议
CC BY-NC-SA 4.0