stl list源码学习笔记
1.list中有一个unique函数,这个函数容易给人造成一种错觉:直接调用它就可以移除list中的重复元素。其实不然,unique函数实现如下:
template <class T, class Alloc> void list<T, Alloc>::unique() { iterator first = begin(); iterator last = end(); if (first == last) return; iterator next = first; while (++next != last) { if (*first == *next) erase(next); else first = next; next = first; } } bool empty() const { return node->next == node; } size_type size() const { size_type result = 0; distance(begin(), end(), result); return result; } template <class _InputIterator, class _Distance>inline void __distance(_InputIterator __first, _InputIterator __last, _Distance& __n, input_iterator_tag){ while (__first != __last) { ++__first; ++__n; }}template <class _RandomAccessIterator, class _Distance>inline void __distance(_RandomAccessIterator __first, _RandomAccessIterator __last, _Distance& __n, random_access_iterator_tag){ __n += __last - __first;}template <class _InputIterator, class _Distance>inline void distance(_InputIterator __first, _InputIterator __last, _Distance& __n){ __distance(__first, __last, __n, iterator_category(__first));} while (__first != __last) { ++__first; ++__n; }中可以看出,其时间复杂度确实是o(n)。至于size()为什么要这样写,请参考:http://hi.baidu.com/acojvbqaknbgmud/item/c4c1d0c55d5b7629ef466525.