文章标题

来源:互联网 发布:c语言switch case语句 编辑:程序博客网 时间:2024/06/06 18:49

list,stl中的基本容器链表,具体来说是环形双向链表。

实现

节点

作为链表,先看其重要的基本元素-节点。 一个节点node构成如下:

  • prev:前置节点
  • next:后置节点
  • data : 数据

迭代器

迭代器内部需要一指针(list_type *node)指向对应节点,并且能够实现一些迭代器的基本操作。

  • ++
self& operator++(){     // ++iter;    node = node->next;    return *this;} self& operator++(){     // iter++;    self tmp = *this;    ++*this;    return tmp;}
  • ->
  • *
self & opearator *()const{    return node->data;}

迭代器基本操作通过节点指针node来实现。

list

对于链表而言,只需要一个节点指针pNode即可实现双向环形链表。该节点指针指向尾部空白节点。
对于链表的相关操作,一个个来分析

  • begin : pNode->next

  • end : pNode

  • empty : pNode->next == pNode

  • size : distance(begin(), end(), result

  • front : *begin(),用到了迭代器的*操作

  • back : *end(),同上

接下来考虑push,pop,insert,erase等操作

  • insert
    注:stl所有insert操作都是插入在当前位置之前
    insert(iterator pos, const T &x); 在pos位置前 插入元素x,涉及新旧节点的next和prev指针更换等,不做具体分析,内部也很简单。
    这里注意: 该函数返回的是新节点的迭代器,并且pos位置的迭代器不改变。

  • push_back
    调用insert操作 insert(end(),x)

  • push_front
    调用insert操作 insert(begin(),x)

  • erase
    删除某个节点,注意函数返回的是被删除节点pos的下一个节点的迭代器

  • pop_front

  • pop_back
  • clear

  • remove
    remove(const T &x) 移除所有元素值为x

  • unique
    移除连续而相同的元素, eg: unique前后
    1,2,2,2,1,3,3,4,1
    1,2,1,3,4,1

  • transfer (内部操作)
    属于内部操作-迁移,transfer(positon,first,last)将[first,last)内所有元素一道postion之前,进行一系列的节点next和prev的更换操作(3条连接6行操作)。 为后续merge,sort等操作提供基础。
    注意:position所在的链表可以和[first,last)所在的链表属于同一个,也可以属于不同的。
    当属于同一个时,position不能处于[first,last)区间内。

  • splice
    splice(iterator pos,list &x);
    splice(iterator pos, list &, iterator first, iterator last);
    对外接口,内部调用transfer操作。

  • sort
    list只能使用自己的函数sort进行排序,从小到大,不能使用stl算法的sort函数进行排序。

当list元素为类或者结构体等非基本数据类型时,需要对>,<等做重载。具体在排序一节中分析。

  • reverse
    对链表进行反转,如升序变降序可用该操作。

  • merge
    链表合并操作,merge(x) 将链表x合并到this上。