实现过程如下
/* 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