[stl源码] 链表的逆

来源:互联网 发布:织梦if判断 编辑:程序博客网 时间:2024/05/24 03:11

实现过程如下

/* by pjzero */template<typename iter>void pj_reverse(iter iter_beg, iter iter_end){    if(iter_beg == iter_end)        return;    --iter_end;    while (iter_beg < iter_end) {        swap(*iter_beg, *iter_end);        ++iter_beg;        --iter_end;    }}

stl 源码调用过程比较复杂,实现过程和上面的一样,在这里也贴出来吧:

  template<typename _RandomAccessIterator>    void    __reverse(_RandomAccessIterator __first, _RandomAccessIterator __last,          random_access_iterator_tag)    {      if (__first == __last)    return;      --__last;      while (__first < __last)      {          std::iter_swap(__first, __last);          ++__first;          --__last;        }    }

源代码中的std::iter_swap(__first, __last)函数实现如下:

  template<typename _ForwardIterator1, typename _ForwardIterator2>    inline void    iter_swap(_ForwardIterator1 __a, _ForwardIterator2 __b)    {    // 省略了c++版本的不同实现,       swap(*__a, *__b);    }

Method 2

第二种实现,利用但链表建表时候的头插法来实现;
这里给出头插法建表的c代码(有头节点);

typedef int ElemType;typedef struct DNode {    ElemType data;    struct DNode *prior;    struct DNode *next;} DNodeList;void CreateListF(DNode *&l, ElemType a[], int n) {    DNode *s;    int i;    l = (DNode *) malloc(sizeof(DNode));    l->next = NULL;    for (i = 0; i < n; i++) {        s = (DNode *) malloc(sizeof(DNode));        s->data = a[i];        s->next = l->next;        l->next = s;    }}

过程收获

  • list 在c++中是双向链表,以后有时间再来好好总结一下;

  • vector迭代器最后一个元素的内容永远是0啊;

    int src[] = {1, 2, 3};
    vector data(src, src+3);
    cout << *data.end() << endl; # output: 0

0 0