概述
List是STL中常用的容器之一,List将元素按顺序储存到链表中,在快速删除和快速插入方面比vector高出许多。STL中的list是一双向链表,具有指向前一节点和后一节点的指针。那么我们开始写一个属于自己的List吧。
list的节点
list的节点应由指向前一节点的指针,指向后一节点的指针一节储存的元素构成。那么我给出节点的定义
template <typename Object> struct Node {
Object object;
Node<Object> *previous;//指向前一节点
Node<Object> *next;//指向后一节点
Node(const Object&obj) :object(obj), next(NULL),previous(NULL) {}
Node():next(NULL),previous(NULL){}
};
迭代器的实现
迭代器类似于指针类型,它也提供了对对象的间接访问。我们可以通过迭代器的遍历来遍历整个链表,也可通过操作迭代器来删除或插入元素。
STL中迭代器有两种:iterator和const_iterator。前一种允许通过迭代器来改变元素的值,后一种则不允许通过迭代器来改变元素值。
我们可以将const_iterator作为父类,iterator作为基类。
template <typename Object> class const_iterator {
protected:
Node<Object>* current;
Object& retrieve()const { return current->data; }
public:
const_iterator() :current(NULL) {}
const Object&operator*()const;
const_iterator &operator++(int);
const_iterator&operator++();
bool operator==(const const_iterator&);
bool operator!=(const const_iterator&);
friend class List<Object>;
};
template <typename Object> const Object& const_iterator<Object>::operator*() const {
return current->object;
}
template <typename Object> const_iterator<Object>& const_iterator<Object>::operator++(int) {
const_iterator old = *this;
++(*this);
return old;
}
template <typename Object> const_iterator<Object>& const_iterator<Object>::operator++() {
current = current->next;
return *this;
}
template <typename Object>bool const_iterator<Object>::operator==(const const_iterator &rhs) {
return current == rhs.current ? true : false;
}
template <typename Object>bool const_iterator<Object>::operator!=(const const_it