实现STL容器需要了解C++的模板和泛型编程。具体实现步骤如下:
1.先定义STL容器的基本结构,以vector为例,定义一个模板类Vector,将模板参数T作为类型参数:
template <typename T>
class Vector {
private:
T* data;
size_t size;
size_t capacity;
public:
Vector();
Vector(size_t n);
~Vector();
T& operator[](size_t index);
void push_back(const T& value);
void pop_back();
size_t getSize() const;
};
2.定义基本的构造函数、析构函数和成员变量:
template <typename T>
Vector<T>::Vector(size_t n) {
capacity = n;
data = new T[n];
size = 0;
}
template <typename T>
Vector<T>::~Vector() {
delete[] data;
}
3.实现push_back和pop_back操作:
template <typename T>
void Vector<T>::push_back(const T& value) {
// 判断是否需要扩容
if (size == capacity) {
capacity *= 2;
T* temp = new T[capacity];
for (size_t i = 0; i < size; i++) {
temp[i] = data[i];
}
delete[] data;
data = temp;
}
data[size] = value;
size++;
}
template <typename T>
void Vector<T>::pop_back() {
if (size > 0) {
size--;
}
}
4.实现getSize和重载[]运算符:
template <typename T>
size_t Vector<T>::getSize() const {
return size;
}
template <typename T>
T& Vector<T>::operator[](size_t index) {
return data[index];
}
5.使用Vector类进行示例:
Vector<int> vec(10); // 定义一个大小为10的整型向量
for (size_t i = 0; i < vec.getSize(); i++) {
vec[i] = i; //向向量中添加数据
vec.push_back(i);
}
vec.pop_back(); // 从向量中删除最后一个数据
for (size_t i = 0; i < vec.getSize(); i++) {
cout << vec[i] << " "; // 输出向量中的所有数据
}
另外一个示例是实现STL的map容器:
template<typename K, typename V>
class Map {
private:
struct Node {
K key;
V value;
Node* left;
Node* right;
Node(K k, V v) :
key(k), value(v),
left(nullptr), right(nullptr) {}
};
Node* root;
public:
Map() : root(nullptr) {}
V& operator[](const K& key);
};
template<typename K, typename V>
V& Map<K, V>::operator[](const K& key) {
if (root == nullptr) {
root = new Node(key, V());
return root->value;
} else {
Node* cur = root;
while (cur != nullptr) {
if (cur->key == key) {
return cur->value;
} else if (cur->key < key) {
if (cur->right == nullptr) {
cur->right = new Node(key, V());
return cur->right->value;
}
cur = cur->right;
} else {
if (cur->left == nullptr) {
cur->left = new Node(key, V());
return cur->left->value;
}
cur = cur->left;
}
}
}
}
使用Map进行示例:
Map<string, int> mp; // 定义一个字符串映射整数的字典
mp["apple"] = 1; // 插入一个键值对
mp["banana"] = 2;
mp["orange"] = 3;
mp["apple"] = 4; // 修改键值对值
cout << mp["apple"] << " "; // 输出键值对值
cout << mp["banana"] << " ";
cout << mp["orange"] << " ";
以上是两条STL容器的示例说明。总体思路是首先定义数据结构,之后定义数据结构的基本方法,然后基于这些方法来实现整个容器。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++实现STL容器的示例 - Python技术站