前文中vector的迭代器就是指针,list的迭代器稍微不一样,list是循环双向带头结点的链表,平时自己操作单链表还是使用自己forward_list或者自己写一个list吧。
先说使用,再说数据结构。文档在这http://www.cplusplus.com/reference/list/list/
1. begin与end为正向迭代器,对迭代器执行++操作,迭代器向后移动
2. rbegin(end)与rend(begin)为反向迭代器,对迭代器执行++操作,迭代器向前移动
3. cbegin与cend为const的正向迭代器,与begin和end不同的是:该迭代器指向节点中的元素值不能修
改
4. crbegin与crend为const的反向迭代器,与rbegin和rend不同的是:该迭代器指向节点中的元素值不
能修改。
迭代器访问元素(借助find()函数),提供头和尾2个地方的直接查询。
reference front();
reference back();
还有对应的cosnt引用返回。
数据结构按照LeetCode上那种方式写,实现可以参考我的mylist https://blog.csdn.net/weixin_41143631/article/details/88373893
形式和我大二数据结构课上的list一样,原理也一样,比较长可以点击左侧“在新页面打开博主的github”查看。
template<class T>
struct ListNode
{
ListNode(const T& val = T())
: _pPre(nullptr)
, _pNext(nullptr)
, _val(val)
{}
ListNode<T>* _pPre;
ListNode<T>* _pNext;
T _val;
}
操作和mylist差不多,循环双向而已。自己实现稍微麻烦,因为要operator*(),oprator->(),operator++(),operator++(int)等重载,我稍微写了下,贴一下。
T& operator*()
{
return _pNode->_val;
}
T* operator->()
{
return &(operator*());
}
随机访问,迭代器不会因为插入失效,前面数组和list的总结有,就不一一赘述。