C++中STL list的实现
时间: 2023-11-21 09:06:51 浏览: 201
【c++】STL之list用法总结
STL(Standard Template Library)是C++中的一个标准库,其中包含了许多常用的数据结构和算法。其中,list是一种常用的数据结构,它是一个双向链表,可以实现快速的插入和删除操作。
下面是C++中STL list的简单实现:
```cpp
template <typename T>
class List {
private:
struct Node {
T data;
Node* prev;
Node* next;
Node(const T& d = T(), Node* p = nullptr, Node* n = nullptr)
: data(d), prev(p), next(n) {}
};
Node* head;
Node* tail;
int size;
public:
List() : head(nullptr), tail(nullptr), size(0) {}
List(const List& other) : head(nullptr), tail(nullptr), size(0) {
for (const auto& item : other) {
push_back(item);
}
}
~List() {
clear();
}
List& operator=(const List& other) {
if (this != &other) {
List tmp(other);
swap(tmp);
}
return *this;
}
void push_back(const T& item) {
Node* new_node = new Node(item, tail, nullptr);
if (tail) {
tail->next = new_node;
} else {
head = new_node;
}
tail = new_node;
++size;
}
void push_front(const T& item) {
Node* new_node = new Node(item, nullptr, head);
if (head) {
head->prev = new_node;
} else {
tail = new_node;
}
head = new_node;
++size;
}
void pop_back() {
if (tail) {
Node* tmp = tail;
tail = tail->prev;
if (tail) {
tail->next = nullptr;
} else {
head = nullptr;
}
delete tmp;
--size;
}
}
void pop_front() {
if (head) {
Node* tmp = head;
head = head->next;
if (head) {
head->prev = nullptr;
} else {
tail = nullptr;
}
delete tmp;
--size;
}
}
T& front() {
return head->data;
}
T& back() {
return tail->data;
}
bool empty() const {
return size == 0;
}
int size() const {
return size;
}
void clear() {
while (!empty()) {
pop_back();
}
}
class iterator {
private:
Node* ptr;
public:
iterator(Node* p = nullptr) : ptr(p) {}
iterator(const iterator& other) : ptr(other.ptr) {}
iterator& operator++() {
ptr = ptr->next;
return *this;
}
iterator operator++(int) {
iterator tmp(*this);
ptr = ptr->next;
return tmp;
}
iterator& operator--() {
ptr = ptr->prev;
return *this;
}
iterator operator--(int) {
iterator tmp(*this);
ptr = ptr->prev;
return tmp;
}
T& operator*() const {
return ptr->data;
}
T* operator->() const {
return &(ptr->data);
}
bool operator==(const iterator& other) const {
return ptr == other.ptr;
}
bool operator!=(const iterator& other) const {
return ptr != other.ptr;
}
};
iterator begin() const {
return iterator(head);
}
iterator end() const {
return iterator(nullptr);
}
iterator rbegin() const {
return iterator(tail);
}
iterator rend() const {
return iterator(nullptr);
}
void swap(List& other) {
std::swap(head, other.head);
std::swap(tail, other.tail);
std::swap(size, other.size);
}
};
```
上述代码中,List类中定义了一个私有结构体Node,它表示双向链表中的每个节点。Node中包含了数据成员data、指向前一个节点的指针prev和指向后一个节点的指针next。List类中还包含了头指针head、尾指针tail和大小size等数据成员。
List类提供了许多操作,包括push_back、push_front、pop_back、pop_front、front、back、empty、size、clear等。其中,push_back和push_front分别表示在双向链表的末尾和开头插入一个元素,pop_back和pop_front分别表示删除双向链表的末尾和开头的元素,front和back分别表示获取双向链表的第一个和最后一个元素,empty表示判断双向链表是否为空,size表示获取双向链表中元素的个数,clear表示清空双向链表中的所有元素。
List类还定义了一个迭代器iterator,它可以用于遍历双向链表中的所有元素。迭代器中包含了一个指向Node的指针ptr,它可以指向双向链表中的任意一个节点。迭代器提供了许多操作,包括++、--、*、->、==、!=等。其中,++和--分别表示迭代器向前和向后移动一个位置,*表示获取迭代器所指向节点的数据成员data,->表示获取迭代器所指向节点的数据成员data的指针,==和!=分别表示判断两个迭代器是否相等和不相等。
List类中还提供了一些其他操作,比如拷贝构造函数、析构函数、赋值运算符、begin、end、rbegin、rend和swap等。其中,拷贝构造函数用于复制另一个List对象,析构函数用于释放所有节点的内存,赋值运算符用于将一个List对象赋值给另一个List对象,begin和end分别返回指向双向链表中第一个元素和最后一个元素的迭代器,rbegin和rend分别返回指向双向链表中最后一个元素和第一个元素的迭代器,swap用于交换两个List对象中的所有数据成员。
阅读全文