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;
}
}

由代码可知,unique函数只能移除相邻的重复结点,故若要移除list中重复的节点,应该先排序(sort),然后再调用unique。

2.list的size()函数的时间复杂度是o(n),这一点要尤其注意,判断list是否为空的时候应该使用empty()而不是0 == size()。empty()的代码如下:

bool empty() const { return node->next == node; }


size()的代码如下:

size_type size() const
{
size_type result = 0;
distance(begin(), end(), result);
return result;
}

其中的distance的源码如下:

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()为什么要这样写,请参考:[url]http://hi.baidu.com/acojvbqaknbgmud/item/c4c1d0c55d5b7629ef466525[/url].

3.要注意list的成员函数remove_if和stl提供的泛型算法remove_if的区别,具体请参考[url]http://blog.csdn.net/steven_wang787/article/details/4513121[/url]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值