C++ vector是一种动态数组,它可以在运行时动态地分配内存空间。它的底层实现是使用指针数组,当数组空间不足时,会重新分配更大的内存空间,并将原有数据复制到新的内存空间中。
以下是C++ vector的一些源码和实现思路:
- vector的定义:
template <typename T>
class vector {
public:
// 构造函数
vector();
vector(size_t n);
vector(size_t n, const T& val);
vector(const vector& other);
// 析构函数
~vector();
// 插入和删除元素
void push_back(const T& val);
void pop_back();
// 访问元素
T& operator[](size_t index);
const T& operator[](size_t index) const;
// 获取vector的大小和容量
size_t size() const;
size_t capacity() const;
// 清空vector
void clear();
// 判断vector是否为空
bool empty() const;
private:
T* m_data;
size_t m_size;
size_t m_capacity;
};
- vector的构造函数:
template <typename T>
vector<T>::vector() {
m_data = nullptr;
m_size = 0;
m_capacity = 0;
}
template <typename T>
vector<T>::vector(size_t n) {
m_data = new T[n];
m_size = n;
m_capacity = n;
}
template <typename T>
vector<T>::vector(size_t n, const T& val) {
m_data = new T[n];
m_size = n;
m_capacity = n;
for (size_t i = 0; i < n; i++) {
m_data[i] = val;
}
}
template <typename T>
vector<T>::vector(const vector& other) {
m_data = new T[other.m_capacity];
m_size = other.m_size;
m_capacity = other.m_capacity;
for (size_t i = 0; i < m_size; i++) {
m_data[i] = other.m_data[i];
}
}
- vector的析构函数:
template <typename T>
vector<T>::~vector() {
delete[] m_data;
}
- vector的push_back函数:
template <typename T>
void vector<T>::push_back(const T& val) {
if (m_size == m_capacity) {
// 如果空间不足,重新分配更大的内存空间
if (m_capacity == 0) {
m_capacity = 1;
} else {
m_capacity *= 2;
}
T* new_data = new T[m_capacity];
for (size_t i = 0; i < m_size; i++) {
new_data[i] = m_data[i];
}
delete[] m_data;
m_data = new_data;
}
m_data[m_size++] = val;
}
- vector的pop_back函数:
template <typename T>
void vector<T>::pop_back() {
if (m_size > 0) {
m_size--;
}
}
- vector的operator[]函数:
template <typename T>
T& vector<T>::operator[](size_t index) {
return m_data[index];
}
template <typename T>
const T& vector<T>::operator[](size_t index) const {
return m_data[index];
}
- vector的size和capacity函数:
template <typename T>
size_t vector<T>::size() const {
return m_size;
}
template <typename T>
size_t vector<T>::capacity() const {
return m_capacity;
}
- vector的clear函数:
template <typename T>
void vector<T>::clear() {
m_size = 0;
}
- vector的empty函数:
template <typename T>
bool vector<T>::empty() const {
return m_size == 0;
}
参考链接:
- https://en.cppreference.com/w/cpp/container/vector
- https://www.geeksforgeeks.org/vector-in-cpp-stl/