const_iterator
typedef __list_iterator<T,T&,T*> iterator;
typedef __list_iterator<T,const T&,const T*> const_iterator;
public:
iterator begin()
{
return iterator(_head->_next);
}
iterator end()
{
return iterator(_head);
}
const_iterator begin() const
{
return iterator(_head->_next);
}
const_iterator end() const
{
return iterator(_head);
}
C++匿名对象
C++匿名对象-CSDN博客https://blog.csdn.net/u014583317/article/details/108705360
pop_back
void pop_back()
{
erase(iterator(_head->_prev));
}
void pop_back()
{
//erase(iterator(_head->_prev));
erase(--end());
}
pop_front
void pop_front()
{
erase(begin());
}
erase
void erase(iterator pos)
{
assert(pos != end());
Node* cur = pos._node;
Node* prev = cur->_prev;
Node* next = cur->_next;
prev->_next = next;
next->_prev = prev;
delete cur;
}
insert
void insert(iterator pos, const T& x)
{
Node* cur = pos._node;
Node* prev = cur->_prev;
Node* newnode = new Node(x);
//prev newnode cur
prev->_next = newnode;
newnode->_prev = prev;
newnode->_next = cur;
cur->_prev = newnode;
}
深浅拷贝
//lt2(lt1)
list(const list<T>& lt)
{
_head = new Node;
_head->_next = _head;
_head->_prev = _head;
const_iterator it = lt.begin();
while (it != lt.end())
{
push_back(*it);
++it;
}
}
优化
for(auto e:lt)
push_back(e);
operator=
//lt1=lt3
list<T>& operator=(const list<T>& lt)
{
if (this != <)
{
clear();
for (auto e : lt)
push_back(e);
}
return *this;
}
现代写法
//lt1=lt3
list<T>& operator=(const list<T>& lt)
{
swap(_head, lt._head);
return *this;
}
迭代器和指针的区别
cur和it都可以表示指向一个节点,在物理内存上存的都是这个节点的地址,物理是一样的。
但是因为其类型不一样,故其意义不一样。
比如*cur是一个指针的解引用,取到的值是节点
而*it的本质是去调operator*,返回的是节点中的值。
类型决定其对空间的解释权
注:list中添加元素迭代器不会失效,删除元素时会发生迭代器失效现象。