c++STL list 简单模拟实现
分享一份c++stl库list简单模拟实现。
(图片来源网络,侵删)
如果能帮到你的话请点个免费的赞吧!!!!!
#pragma once
#include
namespace my_list {
template
class ListNode {
typedef ListNode Node;
public:
//list中需要访问node中的元素,所以用公有
Node* _prev;
Node* _next;
T _val;
//初始化
ListNode(const T& val = T())
:_val( val),
_prev(nullptr),
_next(nullptr)
{}
};
//ref是t的引用,Ptr是t的指针
template
class ListIterator {
typedef ListNode Node;
typedef ListIterator iterator;
public:
Node* _Node;
ListIterator(Node* node)
:_Node(node)
{}
Ref operator*()
{
return _Node->_val;
}
Ptr operator->()
{
return &_Node->_val;
}
//++it
iterator& operator++() {
_Node = _Node->_next;
return *this;
}
//it++
iterator operator++(int) {
iterator tmp(*this);
_Node = _Node->_next;
return tmp;
}//--it
iterator& operator--() {
_Node = _Node->_prev;
return *this;
}
//it++
iterator operator--(int) {
iterator tmp(*this);
_Node = _Node->_prev;
return tmp;
}
bool operator!=(const iterator& it) {
return it._Node != _Node;
}
bool operator==(const iterator& it) {
return it._Node == _Node;
}
};
template
class List {
typedef ListNode Node;
Node* _head;
size_t _size;
public:
typedef List list;
typedef ListIterator iterator;
typedef ListIterator const_iterator;
void Init()
{
_head = new Node;
_head->_next = _head;
_head->_prev = _head;
_size = 0;
}
List()
{
Init();
}
List(const List& it) {
Init();
for (auto e : it)
{
push_back(e);
}
}
list& operator=(list A) {
swap(A);
return *this;
}
iterator begin() {
return _head->_next;
}
iterator end() {
return _head;
}
const_iterator begin() const {
return _head->_next;
}
const_iterator end() const {
return _head;
}
void insert(iterator it, T val) {
Node* tmp = new Node(val);
Node* prev = it._Node->_prev;
Node* next = it._Node;
prev->_next = tmp, tmp->_prev = prev;
next->_prev = tmp, tmp->_next = next;
_size++;
}
void push_back(T val)
{
insert(end(), val);
}
void push_front(T val)
{
insert(begin(), val);
}
iterator earse(iterator it)
{
Node* node = it._Node;
Node* prev = node->_prev;
Node* next = node->_next;
delete node;
prev->_next = next;
next->_prev = prev;
_size--;
return next;
}
void pop_back() {
earse(begin());
}
void pop_front() {
earse(--end());
}
void swap(list A)
{
std::swap(_head, A._head);
std::swap(_size, A._size);
}
size_t size() {
return _size;
}
void clear() {
iterator it = begin();
while (it != end())
{
it = earse(it);
}
}
~List() {
clear();
delete _head;
_head = nullptr;
}
};
免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!
