std::list源码剖析

list的节点(node)

template <class T>
struct __list_node {
  typedef void* void_pointer;
  void_pointer next;
  void_pointer prev;
  T data;
};

这显然是一个双向链表

list的迭代器

list不再能够像vector一样以普通指针作为迭代器,因为其节点不保证在存储空间中连续存在。所以 list 的迭代器必须具备前移、后移的能力,list 提供是 Bidirectional iterator。

template<class T, class Ref, class Ptr>
struct __list_iterator {
  typedef __list_iterator<T, T&, T*>             iterator;
  typedef bidirectional_iterator_tag iterator_category; // 双向移动迭代器
...
  typedef __list_node<T>* link_type;
...

  link_type node; // 迭代器内部当然要有一个普通指针,指向 list 的节点

  __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; }
...
  self& operator++() { 
    node = (link_type)((*node).next);
    return *this;
  }
  self operator++(int) { 
    self tmp = *this;
    ++*this;
    return tmp;
  }
  self& operator--() { 
    node = (link_type)((*node).prev);
    return *this;
  }
...
};

list的数据结构

SGI STL 的 list 是一个双向链表,同时还是一个环状的双向链表;对于任何位置的元素插入或元素移除,list 永远是常数时间。

template <class T, class Alloc = alloc>
class list {
protected:
  typedef __list_node<T> list_node;
public:      
  typedef list_node* link_type;

protected:
  link_type node; //只要一个指针,便可表示整个环状双向链表
...
}

其实也没啥好说的,list就是链表的操作。

你可能感兴趣的:(stl源码剖析,list,链表,数据结构,stl)