`
xinyiwust
  • 浏览: 13504 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

stl list源码学习笔记

    博客分类:
  • C++
阅读更多
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()为什么要这样写,请参考:http://hi.baidu.com/acojvbqaknbgmud/item/c4c1d0c55d5b7629ef466525.

3.要注意list的成员函数remove_if和stl提供的泛型算法remove_if的区别,具体请参考http://blog.csdn.net/steven_wang787/article/details/4513121
0
6
分享到:
评论
4 楼 巴巴米 2012-08-30  
xinyiwust 写道
巴巴米 写道
看了半天才发现是c++,我说我怎么没见过unique这个函数

哈哈,java中还没听说过stl呢。。。

是啊,我就是被stl吸引进来的
3 楼 sdujq 2012-08-30  
巴巴米 写道
看了半天才发现是c++,我说我怎么没见过unique这个函数

+1
2 楼 xinyiwust 2012-08-30  
巴巴米 写道
看了半天才发现是c++,我说我怎么没见过unique这个函数

哈哈,java中还没听说过stl呢。。。
1 楼 巴巴米 2012-08-30  
看了半天才发现是c++,我说我怎么没见过unique这个函数

相关推荐

    C++进阶STL源码笔记

    这份“C++进阶STL源码笔记”可能包含了对这些概念的实例解析,以及作者在学习过程中遇到的问题和解决方案,对于希望提升C++编程技能的人来说,是一份宝贵的参考资料。配合视频教程进行学习,可以让理论与实践相结合...

    c++ -- stl 学习笔记

    这篇学习笔记将深入探讨STL的核心概念、主要组件以及其在实际编程中的应用。 首先,STL的核心概念是容器、迭代器、算法和函数对象。容器是STL提供的一系列数据结构,如vector(动态数组)、list(双向链表)、set...

    《Effective STL》学习笔记

    《Effective STL》是Scott Meyers的一本经典著作,旨在帮助读者深入理解并有效利用STL(Standard Template ...通过阅读“STL源码剖析笔记.doc”,我们可以进一步探索STL的具体实现细节,增强对STL底层工作的认识。

    c++源码 学习笔记

    C++是一种强大的、通用的...总之,这份"C++源码 学习笔记"是一个全面的学习资源,无论是初学者还是经验丰富的程序员,都能从中受益,提升自己的C++技能。通过深入学习和实践,读者将能够编写出高效、可维护的C++程序。

    STLSourceAnalysis:stl原始码剖析(侯捷)的学习笔记

    本学习笔记主要基于侯捷老师的这本书,对STL的源码进行深度分析,以提升对C++编程和STL使用的理解。以下是一些关键知识点: 1. **容器**:STL提供了多种容器,如vector、list、deque、set、map等。vector是动态数组...

    c++源码笔记_非常值得一看

    8. 标准库应用:STL(Standard Template Library)是C++的标准库,包含容器(如vector、list)、算法和迭代器等,极大地提高了开发效率。C++(day10).txt可能介绍了STL的使用。 9. 多线程编程:C++11引入了内置的多...

    达内科技 c++ 培训教程 源码+笔记

    这份"达内科技 C++ 培训教程 源码+笔记"的资源集合,为学习者提供了丰富的学习材料,包括源代码和笔记,是学习C++的理想起点。 首先,C++的基础知识包括语法、数据类型、控制结构、函数等。C++支持基本的数据类型如...

    Visual C++程序设计学习笔记(1-12 源码)

    5. **STL(标准模板库)**:讲解容器(如vector、list、set等)、算法和迭代器的使用。 6. **文件操作**:介绍如何读写文件,包括文本文件和二进制文件的操作。 7. **图形用户界面(GUI)编程**:利用MFC或WinAPI...

    STL_Sources:学习《 STL源码剖析》,存放相关的个人代码及学习笔记

    在这个名为"STL_Sources"的压缩包中,可能包含了读者在学习这本书时编写的个人代码示例以及学习笔记,以加深对STL的理解。 1. **容器**:STL提供了几种基本的容器,如vector(动态数组)、list(双向链表)、deque...

    C++源码 笔记.

    标题"\"C++源码 笔记\""提示我们,这可能是一份关于C++编程的学习资料,可能包括代码示例、概念解释以及编程技巧等内容。笔记通常会涵盖基本语法、数据类型、控制结构、函数、类与对象、模板、STL(Standard ...

    C++进阶笔记源码

    2. **STL(Standard Template Library)**:STL是C++标准库的一部分,提供了容器(如vector、list、map)、算法和迭代器等工具,大大提高了代码的可读性和效率。笔记中可能会详细解析各种容器的使用场景和性能差异,...

    达内C++课堂笔记和源码

    这些知识点在达内的C++课堂笔记和源码中应有详细讲解,通过实际的编程练习和示例,可以帮助学习者深入理解和掌握C++编程。同时,源码部分提供了实践操作的机会,使理论与实践相结合,提升编程技能。

    达内科技c++课件及源码笔记【完美版】【初学者福音】

    "达内科技C++课件及源码笔记【完美版】【初学者福音】"是一份专门为初学者设计的学习资源,包含了C++的基础知识和实践代码,旨在帮助新手快速掌握这一语言。 课件部分可能涵盖了以下几个方面: 1. **基础语法**:...

    c++源码 笔记个人总结

    6. **STL(标准模板库)**:STL是C++库的一部分,包含容器(如vector、list、set等)、迭代器、算法和函数对象,为编程提供了便利。 7. **异常处理**:C++中的异常处理机制允许程序在出现错误时通过throw和catch...

    达内科技 c++ 课件 及 源码 笔记【完美版】【初学者福音】

    达内科技作为知名的IT培训机构,提供的C++课程和源码笔记为初学者提供了丰富的学习资源,帮助他们更好地理解和掌握C++语言。 在C++课件中,你将可能学习到以下知识点: 1. **基础语法**:C++的基础包括变量、数据...

    Linux学习笔记(强悍总结值得一看),细说linux基础知识,C,C++源码.zip

    Linux学习笔记是一个全面涵盖Linux操作系统基础、C语言和C++编程源码的综合学习资源。这份资料对于初学者和有经验的开发者来说都是一个宝贵的参考资料,它深入浅出地介绍了Linux系统的核心概念和操作,同时也提供了C...

    VC笔记源码

    【VC笔记源码】是一个集合了Visual C++(简称VC)技术的代码资源包,它包含了一些高质量的代码示例,旨在为开发者提供学习和参考的素材。在深入探讨这个资源包之前,我们先来了解一下VC及其相关知识点。 Visual C++...

    c++学习笔记.zip

    10. **STL(Standard Template Library)标准模板库**:包括容器(如vector、list、map等)、算法(如排序、查找、迭代器操作等)和迭代器,极大地提高了C++程序员的开发效率。 11. **文件I/O**:C++提供了流式I/O...

    C、C++、Qt、Linux、ARM、数据结构等学习笔记.zip

    这些学习笔记涵盖了一系列重要的计算机科学和技术领域,包括基础编程语言C和C++,GUI开发库Qt,操作系统Linux,以及嵌入式系统中的ARM架构,还有核心的计算机科学概念——数据结构。下面,我将深入解释这些主题的...

Global site tag (gtag.js) - Google Analytics