C++ vector的简单实现
在C++中,vector
是一种非常常用的容器,它能够动态地保存一组元素(比如整数、浮点数以及自定义类型等)。在本文中,我们将分步讲解如何实现一个简单的vector
。
步骤1:定义类和变量
我们首先要定义一个vector
类,它可以保存任意类型的元素,使用template<typename T>
来定义:
template<typename T>
class Vector {
public:
Vector() {
size_ = 0;
capacity_ = 1;
data_ = new T[capacity_];
}
// Other member functions
private:
T* data_;
size_t capacity_;
size_t size_;
};
在这里,我们定义了三个变量:data_
、capacity_
和size_
,它们分别代表了存储数据的数组、数组容量和数组元素个数。我们在构造函数Vector()
中初始化了这些变量,容量初始值为1,大小初始值为0。
步骤2:实现构造函数
在上一步中,我们已经定义了构造函数Vector()
,但是它目前只初始化了变量,还无法向容器中添加元素。我们需要对构造函数进行一些修改,使得它可以将元素插入到数组中。
为了实现这个功能,我们需要使用push_back()
函数,它可以将元素加入到数组的末尾。我们首先先实现push_back()
函数:
void push_back(const T& elem) {
if (size_ == capacity_) {
T* new_data = new T[capacity_ * 2];
for (size_t i = 0; i < capacity_; i++) {
new_data[i] = data_[i];
}
delete[] data_;
data_ = new_data;
capacity_ *= 2;
}
data_[size_] = elem;
size_++;
}
在上述函数中,我们首先检查数组是否已满,如果是,我们将分配一块新的内存,大小是原来的两倍,并将旧数组中的所有数据复制到新数组中。然后,我们将内存中新元素写入新数组的末尾。最后更新size_
变量的值。
修改后的Vector()
构造函数现在可以利用push_back()
实现向数组中添加元素:
template<typename T>
class Vector {
public:
Vector() {
capacity_ = 1;
size_ = 0;
data_ = new T[capacity_];
}
Vector(const T& elem) {
capacity_ = 1;
size_ = 1;
data_ = new T[capacity_];
push_back(elem);
}
// Other member functions
private:
T* data_;
size_t capacity_;
size_t size_;
};
我们还添加了一个新的构造函数Vector(const T& elem)
,它可以在创建Vector
对象时就将第一个元素elem
插入到底层数组中。现在我们已经可以向Vector
对象中添加元素了。
步骤3:实现其他函数
除了push_back()
和构造函数之外,还有许多其他常用函数,比如size()
、empty()
、at()
、front()
和back()
等。我们在这里只展示一部分函数的实现。
template<typename T>
class Vector {
public:
Vector() {...}
// Other member functions
size_t size() const{
return size_;
}
bool empty() const{
return size_ == 0;
}
T& operator[](const size_t& index) {
if (index >= size_) {
throw std::out_of_range("Index out of range");
}
return data_[index];
}
private:
T* data_;
size_t capacity_;
size_t size_;
};
我们必须注意以下两点:
size()
函数只返回数组中当前元素的数量,而不是数组的容量。容量是由capacity_
变量保存的。- 在
operator[]()
函数中,我们首先检查所请求的索引是否在数组范围内,如果不是,则抛出std::out_of_range
异常。如果是,则返回数组中相应索引位置的元素。
示例
现在,我们来看两个具体的使用示例,一个是创建仅包含一个元素的Vector
对象,另一个是向Vector
对象中插入多个元素。
示例1:仅包含一个元素的Vector
对象
Vector<int> vec(5);
std::cout << "size=" << vec.size() << ",capacity=" << vec.capacity() << std::endl; // size=1,capacity=2
在这个示例中,我们创建了一个整数类型的Vector
对象,并将它的第一个元素设置为5。然后,我们输出了对象的大小和容量,发现大小为1,容量为2,这是因为我们初始设定的容量为1,元素个数为1。当我们向数组中添加更多的元素时,容量将自动扩展。
示例2:向Vector
对象中插入多个元素
Vector<MyClass> vec;
MyClass a(1), b(2), c(3);
vec.push_back(a);
vec.push_back(b);
vec.push_back(c);
for (size_t i = 0; i < vec.size(); i++) {
std::cout << vec[i].value() << std::endl; // 1,2,3
}
在这个示例中,我们创建了一个自定义类型MyClass
的Vector
对象,并向其中添加了三个元素。最后,我们使用[]
运算符遍历数组中所有元素,并输出它们的值。
总结
在本文中,我们展示了如何实现一个简单的vector
,步骤包括定义类和变量、实现构造函数、实现其他成员函数和使用vector
对象的示例。实际上,在标准库中有一个更加强大的vector
实现,它提供了比我们在这里实现的更多的功能。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++ vector的简单实现 - Python技术站