在STL中,list是一个双向循环链表,所谓循环链表就是指链表的头部和尾部是连接在一起的,下面两段代码实现的功能是一样的,但是执行过程却有所不同:
//第一种
list<int> lst1;
if (lst1.empty())
{
//do something
}
//第二种
list<int>lst2;
if (lst2.size() == 0)
{
//do something
}
上面两段代码执行的功能都一样的,都是判断list集合内是否有元素,但是实际运行的过程却有所不同。
对于第一种方法,由于list是首尾相连的,因此lst1直接判断头部的下一个节点是否为NULL就知道list是否有节点了,其时间复杂度为O(1);
对于第二种方法,size()函数的作用是获取节点的个数,因此lst2会从头到尾遍历一次链表,以得到链表节点的个数,其时间复杂度为O(n)。
可见,虽然代码量差不多,但是时间复杂度上却相去甚远,当节点数较多的时候,两种写法相差的时间会越加明显。因此,当需要判断list的是否存在节点时,强烈建议使用list的empty()函数。