stl list原理和用法

List的节点

template <class T>
struct __list_node
{
typedef void* void_pointer; 
void_pointer next; //型别为void*,也可以设为__list_node<t>*
void_pointer prev;
T data;
};

这里写图片描述

List的迭代器

在Vector中如果进行插入和删除操作后迭代器会失效,List有一个重要的性质就是插入和接合操作都不会造成原有的List迭代器失效。而且,再删除一个节点时,也仅有指向被删除元素的那个迭代器失效,其他迭代器不受任何影响。下面来看看List迭代器的源码。

template<class T, class Ref, class Ptr>
struct __list_iterator
{
    ....
    typedef bidirectional_iterator_tag iterator_category; //List的迭代器类型为双向迭代器
    typedef __list_node<t>* link_type; 

    // 这个是迭代器实际管理的资源指针
    link_type node;

    // 迭代器构造函数
    __list_iterator(link_type x) : node(x) {}
    __list_iterator() {}
    __list_iterator(const iterator& x) : node(x.node) {}

    // 重载operator *, 返回实际维护的数据
    reference operator*() const { return (*node).data; }
    // 成员调用操作符
    pointer operator->() const { return &(operator*()); }

    // 前缀自加
    self& operator++()
    {
        node = (link_type)((*node).next);
        return *this;
    }

    // 后缀自加, 需要先产生自身的一个副本, 然会再对自身操作, 最后返回副本
    self operator++(int)
    {
        self tmp = *this;
        ++*this;
        return tmp;
    }

List的迭代器实现了==,!=,++,–,取值和成员调用等操作,由于是存放在不连续的内存空间,所以并不支持vector那样的p+n的操作。

List的数据结构

List的数据结构个List的节点数据结构是分开定义的,SGI的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;
....
}

这里写图片描述

iterator begin() { return (link_type)((*node).next);}
iterator end() { return node};

list构造时首先申请一个list_node节点,作为尾端的空白节点。list中node的值就是该list_node的地址。

List的操作和用法

构造函数

   list<int> c0; //空链表

  list<int> c1(3); //建一个含三个默认值是0的元素的链表

  list<int> c2(5,2); //建一个含五个元素的链表,值都是2

  list<int> c4(c2); //建一个c2的copy链表

  list<int> c5(c1.begin(),c1.end()); c5含c1一个区域的元素[_First, _Last)

大小、判断函数

    int size() const:返回容器元素个数

    bool empty() const:判断容器是否为空,若为空则返回true

增加、删除函数

    void push_back(const T& x):list元素尾部增加一个元素x

    void push_front(const T& x):list元素首元素钱添加一个元素X

    void pop_back():删除容器尾元素,当且仅当容器不为空

    void pop_front():删除容器首元素,当且仅当容器不为空

    void remove(const T& x):删除容器中所有元素值等于x的元素

    void clear():删除容器中的所有元素

    iterator insert(iterator it, const T& x ):在迭代器指针it前插入元素x,返回x迭代器指针

    void insert(iterator it,size_type n,const T& x):迭代器指针it前插入n个相同元素x

    void insert(iterator it,const_iterator first,const_iterator last):把[first,last)间的元素插入迭代器指针it前

    iterator erase(iterator it):删除迭代器指针it对应的元素,返回的是it下一个节点的迭代器

    iterator erase(iterator first,iterator last):删除迭代器指针[first,last)间的元素,返回last

遍历函数

iterator begin():返回首元素的迭代器指针

iterator end():返回尾元素之后位置的迭代器指针

reverse_iterator rbegin():返回尾元素的逆向迭代器指针,用于逆向遍历容器

reverse_iterator rend():返回首元素前一个位置的迭代器指针

reference front():返回首元素的引用

reference back():返回尾元素的
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值