【C++STL】模拟实现vector容器
发布人:shili8
发布时间:2024-12-28 04:20
阅读次数:0
**模拟实现Vector容器**
在C++标准库中,`std::vector`是最常用的序列容器之一。它提供了动态数组的功能,并且支持随机访问、插入和删除等操作。在本文中,我们将尝试模拟实现一个类似于`std::vector`的容器。
###1. 类定义首先,我们需要定义一个名为 `MyVector` 的类,继承自 `std::allocator`:
cpptemplate <typename T> class MyVector : public std::allocator<T> { public: // ... };
这里,我们使用了模板来使得 `MyVector` 可以容纳任意类型的元素。
###2. 构造函数我们需要定义一个构造函数,用于初始化 `MyVector` 对象:
cpptemplate <typename T> class MyVector : public std::allocator<T> { public: explicit MyVector(size_t n =0) : _capacity(n), _size(0) {} private: size_t _capacity; size_t _size; };
在这个构造函数中,我们设置了容器的初始大小为 `n`,同时也初始化了 `_capacity` 和 `_size` 成员变量。
###3. resize()
当我们需要改变容器的大小时,可以使用 `resize()` 函数:
cpptemplate <typename T> class MyVector : public std::allocator<T> { public: void resize(size_t n) { if (n > _capacity) { // ... } else if (n < _size) { // ... } } private: size_t _capacity; size_t _size; };
在这个函数中,我们需要检查新的大小是否大于当前容器的大小。如果是,则需要重新分配内存空间;如果小于,则需要删除多余的元素。
###4. push_back()
当我们需要添加新元素时,可以使用 `push_back()` 函数:
cpptemplate <typename T> class MyVector : public std::allocator<T> { public: void push_back(const T& value) { if (_size == _capacity) { // ... } _data[_size++] = value; } private: size_t _capacity; size_t _size; T* _data; };
在这个函数中,我们需要检查当前容器是否已满。如果是,则需要重新分配内存空间;否则,可以直接添加新元素。
###5. pop_back()
当我们需要删除最后一个元素时,可以使用 `pop_back()` 函数:
cpptemplate <typename T> class MyVector : public std::allocator<T> { public: void pop_back() { if (_size ==0) { // ... } _data[--_size] = T(); } private: size_t _capacity; size_t _size; T* _data; };
在这个函数中,我们需要检查当前容器是否为空。如果是,则什么也不做;否则,可以直接删除最后一个元素。
###6. operator[]当我们需要访问指定位置的元素时,可以使用 `operator[]` 函数:
cpptemplate <typename T> class MyVector : public std::allocator<T> { public: T& operator[](size_t n) { if (n >= _size) { // ... } return _data[n]; } private: size_t _capacity; size_t _size; T* _data; };
在这个函数中,我们需要检查指定位置是否超出当前容器的大小。如果是,则什么也不做;否则,可以直接返回指定位置的元素。
###7. at()
当我们需要访问指定位置的元素时,可以使用 `at()` 函数:
cpptemplate <typename T> class MyVector : public std::allocator<T> { public: T& at(size_t n) { if (n >= _size) { // ... } return _data[n]; } private: size_t _capacity; size_t _size; T* _data; };
在这个函数中,我们需要检查指定位置是否超出当前容器的大小。如果是,则抛出异常;否则,可以直接返回指定位置的元素。
###8. begin() 和 end()
当我们需要访问容器的开始和结束时,可以使用 `begin()` 和 `end()` 函数:
cpptemplate <typename T> class MyVector : public std::allocator<T> { public: iterator begin() { return _data; } iterator end() { return _data + _size; } private: size_t _capacity; size_t _size; T* _data; };
在这个函数中,我们可以直接返回容器的开始和结束指针。
###9. empty()
当我们需要检查容器是否为空时,可以使用 `empty()` 函数:
cpptemplate <typename T> class MyVector : public std::allocator<T> { public: bool empty() const { return _size ==0; } private: size_t _capacity; size_t _size; };
在这个函数中,我们可以直接检查当前容器的大小是否为零。
###10. size()
当我们需要获取容器的大小时,可以使用 `size()` 函数:
cpptemplate <typename T> class MyVector : public std::allocator<T> { public: size_t size() const { return _size; } private: size_t _capacity; size_t _size; };
在这个函数中,我们可以直接返回当前容器的大小。
###11. capacity()
当我们需要获取容器的最大容量时,可以使用 `capacity()` 函数:
cpptemplate <typename T> class MyVector : public std::allocator<T> { public: size_t capacity() const { return _capacity; } private: size_t _capacity; size_t _size; };
在这个函数中,我们可以直接返回当前容器的最大容量。
###12. reserve()
当我们需要改变容器的最大容量时,可以使用 `reserve()` 函数:
cpptemplate <typename T> class MyVector : public std::allocator<T> { public: void reserve(size_t n) { _capacity = n; } private: size_t _capacity; size_t _size; };
在这个函数中,我们可以直接改变当前容器的最大容量。
###13. max_size()
当我们需要获取容器的最大可能大小时,可以使用 `max_size()` 函数:
cpptemplate <typename T> class MyVector : public std::allocator<T> { public: size_t max_size() const { return std::numeric_limits<size_t>::max(); } private: size_t _capacity; size_t _size; };
在这个函数中,我们可以直接返回最大可能大小。
###14. operator==当我们需要比较两个容器是否相等时,可以使用 `operator==` 函数:
cpptemplate <typename T> class MyVector : public std::allocator<T> { public: bool operator==(const MyVector& other) const { return _size == other._size && std::equal(_data, _data + _size, other._data); } private: size_t _capacity; size_t _size; T* _data; };
在这个函数中,我们可以直接比较两个容器的大小和元素是否相等。
###15. operator!=当我们需要比较两个容器是否不相等时,可以使用 `operator!=` 函数:
cpptemplate <typename T> class MyVector : public std::allocator<T> { public: bool operator!=(const MyVector& other) const { return !(*this == other); } private: size_t _capacity; size_t _size; T* _data; };
在这个函数中,我们可以直接比较两个容器是否相等,然后取反结果。
###16. swap()
当我们需要交换两个容器的内容时,可以使用 `swap()` 函数:
cpptemplate <typename T> class MyVector : public std::allocator<T> { public: void swap(MyVector& other) { std::swap(_data, other._data); } private: size_t _capacity; size_t _size; T* _data; };
在这个函数中,我们可以直接交换两个容器的内容。
###17. get_allocator()
当我们需要获取容器的分配器时,可以使用 `get_allocator()` 函数:
cpptemplate <typename T> class MyVector : public std::allocator<T> { public: allocator_type get_allocator() const { return *this; } private: size_t _capacity; size_t _size; };
在这个函数中,我们可以直接返回容器的分配器。
###18. emplace_back()
当我们需要添加新元素时,可以使用 `emplace_back()` 函数:
cpptemplate <typename T> class MyVector : public std::allocator<T> {