目录
1.List
-
List是连续的容器,而vector是非连续的容器,即list将元素存储在连续的存储器中,而vector存储在不连续的存储器中。
-
向量(vector)中间的插入和删除是非常昂贵的,因为它需要大量的时间来移动所有的元素。链表克服了这个问题,它是使用list容器实现的。
-
List支持双向,并为插入和删除操作提供了一种有效的方法。
-
在列表中遍历速度很慢,因为列表元素是按顺序访问的,而vector支持随机访问。
2.list 模拟实现
2.1基本框架
list_node来实现每个节点,list_iterator和list_const_iterator是两个不同版本的迭代器一个是普通迭代器一个是const类型的迭代器,名字上也有所区分,list本身就有迭代器的效果,这个是为了模拟这个,重载了一些基本运算符,而list是统一管理节点,具有增删查改等效果
#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
#include <cassert>
#include <algorithm> // For std::reverse
using namespace std;
namespace List
{
// 节点类
template<class T>
class list_node
{
public:
T _data;
list_node<T>* _next;
list_node<T>* _prev;
list_node(const T& data = T())
: _data(data)
, _next(nullptr)
, _prev(nullptr)
{}
};
//list迭代器
template<class T>
struct list_iterator
{
typedef list_node<T> Node;
typedef list_iterator<T> Self;
Node* _node;
list_iterator(Node* node)
: _node(node)
{ }
};
//const版本迭代器
template<class T>
struct list_const_iterator
{
typedef list_node<T> Node;
typedef list_const_iterator<T> Self;
Node* _node;
// 修正: list_const_iterator 的构造函数应该接受 Node* 类型
list_const_iterator(Node* node)
: _node(node)
{ }
};
//实现list
template<class T>
class list
{
typedef list_node<T> Node;
public:
typedef list_iterator<T> iterator;
typedef list_const_iterator<T> const_iterator;
list()
{
_head = new Node(T());
_head->_next = _head;
_head->_prev = _head;
_size = 0;
}
~list()
{
while (!empty())
{
pop_front();
}
delete _head;
}
private:
Node* _head;
size_t _size;
};
}
2.2 list_node
定义节点
template<class T>
class list_node
{
public:
T _data;
list_node<T>* _next;
list_node<T>* _prev;
list_node(const T& data = T())
: _data(data)
, _next(nullptr)
, _prev(nullptr)
{}
};
2.3 list
维护节点
//实现list
template<class T>
class list
{
typedef list_node<T> Node;
public:
typedef list_iterator<T> iterator;
typedef list_const_iterator<T> const_iterator;
list()
{
_head = new Node(T());
_head->_next = _head;
_head->_prev = _head;
_size = 0;
}
~list()
{
while (!empty())
{
pop_front();
}
delete _head;
}
private:
Node* _head;
size_t _size;
};
2.3.1 默认构造
//默认构造
list()
{
_head = new Node(T());
_head->_next = _head;
_head->_prev = _head;
_size = 0;
}
2.3.2 析构函数
//析构函数
~list()
{
while (!empty())
{
pop_front();
}
delete _head;
}
2.3.3 begin()
开始位置的迭代器
//begin()
iterator begin()
{
return iterator(_head->_next);
}
//const
const_iterator begin() const
{
return const_iterator(_head->_next);
}
2.3.4 end()
结尾位置的迭代器
//普通版
iterator end()
{
return iterator(_head);
}
//const版
const_iterator end() const
{
return const_iterator(_head);
}
2.3.5 size()
数据个数
size_t size() const
{
return _size;
}
2.3.6 empty()
判空
bool empty() const
{
return _size == 0;
}
2.3.7 insert()
指定位置插入
void insert(iterator pos, const T& x)
{
Node* cur = pos._node;
Node* prev = cur->_prev;
Node* newnode = new Node(x);
//prev newnode cur
newnode->_next = cur;
cur->_prev = newnode;
newnode->_prev = prev;
prev->_next = newnode;
++_size;
}
2.3.8 push_back()
尾插
void push_back(const T& x)
{
insert(end(), x);
}
2.3.9 push_front()
头插
void push_front(const T& x)
{
insert(begin(), x);
}
2.3.10 erase ()
指定位置删除
void erase(iterator pos)
{
assert(pos != end());
Node* prev = pos._node->_prev;
Node* next = pos._node->_next;
prev->_next = next;
next->_prev = prev;
delete pos._node;
--_size;
}
2.3.11 pop_back()
尾删
void pop_back()
{
erase(--end());
}
2.3.12 pop_front()
头删
void pop_front()
{
erase(begin());
}
2.3.13 list完整代码
template<class T>
class list
{
typedef list_node<T> Node;
public:
typedef list_iterator<T> iterator;
typedef list_const_iterator<T> const_iterator;
list()
{
_head = new Node(T());
_head->_next = _head;
_head->_prev = _head;
_size = 0;
}
iterator begin()
{
return iterator(_head->_next);
}
iterator end()
{
return iterator(_head);
}
const_iterator begin() const
{
return const_iterator(_head->_next);
}
const_iterator end() const
{
return const_iterator(_head);
}
size_t size() const
{
return _size;
}
bool empty() const
{
return _size == 0;
}
void insert(iterator pos, const T& x)
{
Node* cur = pos._node;
Node* prev = cur->_prev;
Node* newnode = new Node(x);
//prev newnode cur
newnode->_next = cur;
cur->_prev = newnode;
newnode->_prev = prev;
prev->_next = newnode;
++_size;
}
void push_back(const T& x)
{
insert(end(), x);
}
void push_front(const T& x)
{
insert(begin(), x);
}
void erase(iterator pos)
{
assert(pos != end());
Node* prev = pos._node->_prev;
Node* next = pos._node->_next;
prev->_next = next;
next->_prev = prev;
delete pos._node;
--_size;
}
void pop_back()
{
erase(--end());
}
void pop_front()
{
erase(begin());
}
~list()
{
while (!empty())
{
pop_front();
}
delete _head;
}
private:
Node* _head;
size_t _size;
};
2.4 list_iterator
为了支持list迭代器效果而模拟实现了一个迭代器
template<class T>
struct list_iterator
{
typedef list_node<T> Node;
typedef list_iterator<T> Self;
Node* _node;
list_iterator(Node* node)
: _node(node)
{ }
};
2.4.1 - >
// 修正: 返回指向 _data 的指针,而不是引用
T* operator->()
{
return &_node->_data;
}
2.4.2 *
T& operator*()
{
return _node->_data;
}
2.4.3 前置++
Self& operator++()
{
_node = _node->_next;
return *this;
}
2.4.4 后置++
Self operator++(int)
{
Self tmp(*this);
_node = _node->_next;
return tmp;
}
2.4.5 前置--
Self& operator--()
{
_node = _node->_prev;
return *this;
}
2.4.6 后置 --
Self operator--(int)
{
Self tmp(*this);
_node = _node->_prev;
return tmp;
}
2.4.7 !=
bool operator!=(const Self& x) const
{
return _node != x._node;
}
2.4.8 list_iterator完整代码
template<class T>
struct list_iterator
{
typedef list_node<T> Node;
typedef list_iterator<T> Self;
Node* _node;
list_iterator(Node* node)
: _node(node)
{ }
// 修正: 返回指向 _data 的指针,而不是引用
T* operator->()
{
return &_node->_data;
}
T& operator*()
{
return _node->_data;
}
Self& operator++()
{
_node = _node->_next;
return *this;
}
Self operator++(int)
{
Self tmp(*this);
_node = _node->_next;
return tmp;
}
Self& operator--()
{
_node = _node->_prev;
return *this;
}
Self operator--(int)
{
Self tmp(*this);
_node = _node->_prev;
return tmp;
}
bool operator!=(const Self& x) const
{
return _node != x._node;
}
};
2.5 list_const_iterator
list_const_iterator和list_iterator实现原理一致,只是有些成员函数被const修饰,typedef了const
template<class T>
struct list_const_iterator
{
typedef list_node<T> Node;
typedef list_const_iterator<T> Self;
Node* _node;
// 修正: list_const_iterator 的构造函数应该接受 Node* 类型
list_const_iterator(Node* node)
: _node(node)
{ }
// 修正: 返回指向 _data 的 const 指针,而不是引用
const T* operator->() const
{
return &_node->_data;
}
const T& operator*() const
{
return _node->_data;
}
Self& operator++()
{
_node = _node->_next;
return *this;
}
Self operator++(int)
{
Self tmp(*this);
_node = _node->_next;
return tmp;
}
Self& operator--()
{
_node = _node->_prev;
return *this;
}
Self operator--(int)
{
Self tmp(*this);
_node = _node->_prev;
return tmp;
}
bool operator!=(const Self& x) const
{
return _node != x._node;
}
};
3.整个实现完整代码
#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
#include <cassert>
#include <algorithm> // For std::reverse
using namespace std;
namespace List
{
// 节点类
template<class T>
class list_node
{
public:
T _data;
list_node<T>* _next;
list_node<T>* _prev;
list_node(const T& data = T())
: _data(data)
, _next(nullptr)
, _prev(nullptr)
{}
};
template<class T>
struct list_iterator
{
typedef list_node<T> Node;
typedef list_iterator<T> Self;
Node* _node;
list_iterator(Node* node)
: _node(node)
{ }
// 修正: 返回指向 _data 的指针,而不是引用
T* operator->()
{
return &_node->_data;
}
T& operator*()
{
return _node->_data;
}
Self& operator++()
{
_node = _node->_next;
return *this;
}
Self operator++(int)
{
Self tmp(*this);
_node = _node->_next;
return tmp;
}
Self& operator--()
{
_node = _node->_prev;
return *this;
}
Self operator--(int)
{
Self tmp(*this);
_node = _node->_prev;
return tmp;
}
bool operator!=(const Self& x) const
{
return _node != x._node;
}
};
template<class T>
struct list_const_iterator
{
typedef list_node<T> Node;
typedef list_const_iterator<T> Self;
Node* _node;
// 修正: list_const_iterator 的构造函数应该接受 Node* 类型
list_const_iterator(Node* node)
: _node(node)
{ }
// 修正: 返回指向 _data 的 const 指针,而不是引用
const T* operator->() const
{
return &_node->_data;
}
const T& operator*() const
{
return _node->_data;
}
Self& operator++()
{
_node = _node->_next;
return *this;
}
Self operator++(int)
{
Self tmp(*this);
_node = _node->_next;
return tmp;
}
Self& operator--()
{
_node = _node->_prev;
return *this;
}
Self operator--(int)
{
Self tmp(*this);
_node = _node->_prev;
return tmp;
}
bool operator!=(const Self& x) const
{
return _node != x._node;
}
};
template<class T>
class list
{
typedef list_node<T> Node;
public:
typedef list_iterator<T> iterator;
typedef list_const_iterator<T> const_iterator;
list()
{
_head = new Node(T());
_head->_next = _head;
_head->_prev = _head;
_size = 0;
}
iterator begin()
{
return iterator(_head->_next);
}
iterator end()
{
return iterator(_head);
}
const_iterator begin() const
{
return const_iterator(_head->_next);
}
const_iterator end() const
{
return const_iterator(_head);
}
size_t size() const
{
return _size;
}
bool empty() const
{
return _size == 0;
}
void insert(iterator pos, const T& x)
{
Node* cur = pos._node;
Node* prev = cur->_prev;
Node* newnode = new Node(x);
//prev newnode cur
newnode->_next = cur;
cur->_prev = newnode;
newnode->_prev = prev;
prev->_next = newnode;
++_size;
}
void push_back(const T& x)
{
insert(end(), x);
}
void push_front(const T& x)
{
insert(begin(), x);
}
void erase(iterator pos)
{
assert(pos != end());
Node* prev = pos._node->_prev;
Node* next = pos._node->_next;
prev->_next = next;
next->_prev = prev;
delete pos._node;
--_size;
}
void pop_back()
{
erase(--end());
}
void pop_front()
{
erase(begin());
}
~list()
{
while (!empty())
{
pop_front();
}
delete _head;
}
private:
Node* _head;
size_t _size;
};
void test1()
{
list<int> lt;
lt.push_back(1);
lt.push_back(2);
list<int>::iterator it = lt.begin();
while (it != lt.end())
{
cout << *it << " ";
++it;
}
cout << endl;
}
}