list及其与STL整体架构
STL分成六大部分:容器(container)、算法(algorithm),迭代器(iterator)、配接器(adapter)、仿函数(functor)、配置器(allocator)
此处先来介绍一下list(双向链表)
list
相较于vector的连续线性空间,list就显得复杂很多,他的好处是每次插入或删除一个元素,就配置一个元素空间,因此,list对于空间的运用有绝对的精准,一点也不浪费,而且,对于任何位置的元素插入或删除,list永远是常数时间。
引入标准库(standard library)文件
#include <list>
node:list的节点
鉴于链表的独特性,其在内存空间是一种线性结构,是链式存储结构,因此就会存在节点(node)的定义
template <class T> // list数据类型
struct __list_node {
typedef void* void_pointer;
void_pointer prev; // 前指针
void_pointer next; // 后指针
T data; // 数据域
};
iterator:list的迭代器
list的迭代器不能像vector一样以普通指针为迭代器,其行动时应该指向的是节点。而其具有前移、后移的能力,因此list提供的是bidirectional iterator(双向迭代器)
// T 数据类型
// Ref 引用
// Ptr 指针
template <class T, class Ref, class Ptr>
struct __list_iterator {
typedef __list_iterator<T, T&, T*> iterator;
typedef __list_iterator<T, Ref, Ptr> self;
// 重命名迭代器
typedef bidirectional_iterator_tag iterator_category;
// 重命名数据
typedef T value_type;
typedef Ref reference;
typedef Ptr pointer;
// 重命名节点
typedef __list_node<T>* link_type;
typedef size_t size_type;
typedef ptrdiff_t difference_type;
// 节点,注意节点是一个结构体指针
link_type node;
// 构造节点
__list_iterator(link_type x): node(x) {
}
__list_iterator() {
}
// 构造节点的数据域
__list_iterator(const iterator& x): node(x.node) {
}
bool operator==(const self& x)const {
return node==x.node};
bool operator!=(const self& x)const {
return node!=x.node};
// 对迭代器取值
reference operator*()const {
return (*node).data;}
pointer operator->()const {
return &(operator*());}
// 对迭代器累加1,前进一个节点,前置递增
slef& operator++() {
node = (link_type)((*node).next);
return *this;
}
// 对迭代器递减1,后退一个节点,前置递减
slef& operator--() {
node = (link_type)((*node).prev);
return *this;

本文详细介绍了C++标准模板库(STL)中的list容器。包括list的双向链表特性、节点(node)和迭代器(iterator)的实现原理,以及list如何进行元素插入、删除等操作。此外还介绍了list与STL算法的配合使用。
最低0.47元/天 解锁文章
1824

被折叠的 条评论
为什么被折叠?



