要编写一个STL兼容的容器,需要满足一些隐含要求。下面是一个示例解决方法,以编写一个简单的STL兼容的动态数组容器为例。
#include
#include
#include
template
class MyVector {
private:
T* data;
size_t size;
size_t capacity;
public:
MyVector() : data(nullptr), size(0), capacity(0) {}
~MyVector() {
delete[] data;
}
size_t Size() const {
return size;
}
bool Empty() const {
return size == 0;
}
T& operator[](size_t index) {
return data[index];
}
const T& operator[](size_t index) const {
return data[index];
}
void PushBack(const T& value) {
if (size >= capacity) {
size_t newCapacity = capacity == 0 ? 1 : capacity * 2;
Reserve(newCapacity);
}
data[size++] = value;
}
void PopBack() {
if (!Empty()) {
--size;
}
}
void Reserve(size_t newCapacity) {
if (newCapacity <= capacity) {
return;
}
T* newData = new T[newCapacity];
std::copy(data, data + size, newData);
delete[] data;
data = newData;
capacity = newCapacity;
}
void Resize(size_t newSize) {
Reserve(newSize);
size = newSize;
}
class iterator {
private:
T* ptr;
public:
using iterator_category = std::random_access_iterator_tag;
using value_type = T;
using difference_type = std::ptrdiff_t;
using pointer = T*;
using reference = T&;
iterator(T* p) : ptr(p) {}
iterator& operator++() {
++ptr;
return *this;
}
iterator operator++(int) {
iterator temp = *this;
++ptr;
return temp;
}
iterator& operator--() {
--ptr;
return *this;
}
iterator operator--(int) {
iterator temp = *this;
--ptr;
return temp;
}
iterator& operator+=(size_t n) {
ptr += n;
return *this;
}
iterator operator+(size_t n) const {
iterator temp = *this;
return temp += n;
}
iterator& operator-=(size_t n) {
ptr -= n;
return *this;
}
iterator operator-(size_t n) const {
iterator temp = *this;
return temp -= n;
}
difference_type operator-(const iterator& rhs) const {
return ptr - rhs.ptr;
}
reference operator*() const {
return *ptr;
}
pointer operator->() const {
return ptr;
}
reference operator[](size_t index) const {
return ptr[index];
}
bool operator==(const iterator& rhs) const {
return ptr == rhs.ptr;
}
bool operator!=(const iterator& rhs) const {
return !(*this == rhs);
}
bool operator<(const iterator& rhs) const {
return ptr < rhs.ptr;
}
bool operator>(const iterator& rhs) const {
return ptr > rhs.ptr;
}
bool operator<=(const iterator& rhs) const {
return ptr <= rhs.ptr;
}
bool operator>=(const iterator& rhs) const {
return ptr >= rhs.ptr;
}
};
iterator begin() {
return iterator(data);
}
iterator end() {
return iterator(data + size);
}
};
int main() {
MyVector vec;
vec.PushBack(1);
vec.PushBack(2);
vec.PushBack(3);
for (auto it = vec.begin(); it != vec.end(); ++it) {
std::cout << *it << " ";
}
std::cout << std::endl;
return 0;
}
这个示例实现了一个简单的动态数组容器MyVector
,具有STL兼容的功能,包括Size()
、Empty()
、operator[]
、PushBack()
、PopBack()
、Reserve()
、Resize()
、begin()
和end()
等成员函数。还实现了一个嵌套的iterator
类,用于支持迭代器访