STL 学习笔记

utility:

  pair为具有两个public成员的类模板。

  make_pair为一个模板函数,根据参数生成pair对象。 

      rel_ops为一个namespace,里面包含几个模板函数,可以由==、<推导出 !=、<=、>、>=,减少工作量。

memory:

  auto_ptr智能指针类

    1.内部指针操作:

            T* get()throw();返回指向的对象的指针

        T* release()throw();返回指向的对象的指针,不再指向该对象

            T* reset(T* =0)throw();指向另一个对象,之前指向的对象被delete掉

            2.指针形为模拟:

             T& operator*()throw();

             T *operator->()throw(); 

    3.构造函数:

     explicit auto_ptr (X* p=0) throw();

            auto_ptr (auto_ptr& a) throw(); 无auto_ptr(const auto_ptr &)throw(),所以不能auto_ptr不能放入容器中。

            template<class Y>  auto_ptr (auto_ptr<Y>& a) throw();

            auto_ptr (auto_ptr_ref<X> r) throw();

            4.opertor=

    auto_ptr& operator= (auto_ptr& a) throw();

    template <class Y>  auto_ptr& operator= (auto_ptr<Y>& a) throw();

    auto_ptr& operator= (auto_ptr_ref<X> r) throw();

    5.类型转换操作符

    template <class Y> operator auto_ptr_ref<Y>() throw();

    template <class Y> operator auto_ptr<Y>() throw()

         auto_ptr_ref

                  auto_ptr_ref是auto_ptr的辅助类。因auto_ptr没有const & copy构造函数,所以auto_ptr对象不能用右值进行初始化,这意味着 auto_ptr(auto_ptr<T> (ptr))这种用临时量进行初始化的写法是不能通过编译的,同时auto_ptr对象也不能在函数间进行传递。 auto_ptr_ref正是为了解决这个问题而产生的。使用的时候完全可以当它不存在。

    auto_ptr使用禁忌:1.不能指向数组,因为它释放使用的是delete,而不是delete [];2,auto_ptr不能存入容器。

    get_temporary_buffer申请一块未经初始化的内存  return_temporary_buffer将get_temporary_buffer申请到的内存回收。(vc6中为__get_temporary_buffer)

    raw_storage_iterator用于将未经初始化的内存包装成一个output_iterator。

    uninitialized_copy,unitialized_fill,unitialized_fill_n对应 copy,fill,fill_n.后者操作经过初始化的内存,前者操作未经初始化的内存(malloc,get_temporary_buffer等返回)。

 

  functional:提供仿函数支持

       Base class:  

      unary_function<argument_type,result_type>

         binary_function<first_argument_type,second_argument_type,result_type>

   Operator classes:对常用操作符进行包装

         plus:+,minus:-,multiplies:*,divides:/,modulus:%,negate:-

      equal_to:=,not_equal_to:!=,greater:>,less<,greater_equal:>=,less_eqaul:<=

                logical_not:!,logical_and:&&,logical_or:||

   适配器和转换函数:

       not1,not2用一个仿函数(设为funA)生成另一个仿函数(设为funB),funB功能相当于!funA.

     not1要求funA继承自unary_function或者 typedef 了 argument_type类型,并且返回值允许!操作.

       not2要求funB继承自binary_function或者 typedef 了 first_argument_type 和 second_argument_type,并且返回值允许!操作

     bind1st,bind2nd将二参仿函数的一个参数绑定成一个固定值,生成一个一参仿函数。要求二参仿函数继承自

binary_function或者typedef 了 first_argument_type,second_argument_type,result_type。不支持返回值为void

的仿函数的转换。

     ptr_fun,mem_fun,mem_fun_ref根据 函数生成相应的仿函数

       ptr_fun支持非成员函数的转换,只支持一参和二参函数

         mem_fun,支持类成员函数的转换,只支持无参及一参成员函数。类对象通过指针传递

         mem_fun_ref,支持类成员函数的转换,只支持无参及一参成员函数。类对象通过引用传递

 

  algorithm:通用算法库

          for_each,transform遍历算法,for_each只接受一参函数,transform接受一参与二参函数,且把结果存入另一个序列。

     find,find_if,find_end,find_first_of,search,search_n,adjacent_find   find算法.find_end与search相似,都是搜索子串,find_end从后面找,search从前面找。search_n搜索n个连续相同元素的起始位置。adjacent_find搜索相邻元素满足条件第一个出现的位置,默认条件为==。

       count,count_if 计算满足条件的元素的个数,默认操作为==

     mismatch比较两个序列,返回它们开始不同的位置。

     equal比较两个序列是否相等

     copy,copy_backward复制算法,copy_backward从后往前copy,可处理两个序列指向的元素有交叉的情况。

       swap,swap_ranges,iter_swap交换算法,功能分别为交换两个对象的值,交换两个序列的值,交换两个迭代器所指对象的值。

               replace,replace_if,replace_copy,replace_copy_if替换算法。 带_copy的不修改原序列,结果存入另一个序列。

       fill,fill_n,generate,generate_n填充算法。默认用[first,last)来表示这个序列,_n表示用first与n来表示序列。generate与fill的不同在于,fill用一个用户传递的值填充,而generate用一个函数的返回值来填充。

        remove,remove_if,remove_copy,remove_copy_if 移除序列中的某些元素。remove移除值==某值的元素。remove_if移除满足条件的元素。 加上_copy则不改动原序列,将改动后的结果存入另一个序列。

      unique,unique_copy 如果序列中有相连的元素之间满足条件,则后者被移除。默认条件为==。

       reverse,reverse_copy将序列中所有元素的位置颠倒过来。

      rotate,rotate_copy 旋转整个序列,参数有3个,first,last,middle,[first,last)表示序列,middle表示要将middle所指的元素旋转到first的位置。

       random_shuffle将整个序列打乱重排,可指定产生随机数据的函数。要求输入的序列为RandomIterator表示。

      partition,stable_partition,将一个序列打乱重排,满足条件的排前面,不满足条件的排后面,返回不满足条件的元素的起始位置。stable_partition在重排的过程中不会打乱同组(满足条件,不满足条件)元素原本的前后顺序。

    sort,stable_sort,partial_sort,partial_sort_copy,nth_element 排序。迭代器要求为RandomIterator。sort默认用<比较,得到升序序列,可以另指定比较函数。stable_sort相比sort,不会打乱原来相等的两个元素的前后位置。partial_sort取得前n个最小的元素,这几个元素有序,其它元素无序。nth_element(first,middle,last) 将序列重排,middle之前的元素都比middle之后的元素小,*middle刚好是第middle-first个元素,而前后两部分都不保证有序。 sort,partial_sort,nth_element 从前到后,排序的有序程度依次降低,效率则依次上升。

      min,min_element,返回最小的那个元素,可指定比较函数,默认为<

      max,max_element返回最大的那个元素,可指定比较函数,默认为<

      lexicographical_compare 按字典序比较两个序列。

      next_permutation,prev_permutation将序列按字典序重排列为 下一种/上一种形式。返回值为false表示不存在下一种/上一种形式了。

      make_heap,push_heap,pop_heap,sort_heap 堆操作,make_heap生成堆,push_heap,pop_heap对堆 进行push,pop操作.sort_heap将堆排成有序序列。push的数及pop的返回值都放在last-1位置上。make_heap+sort_heap=堆排序。

    以下算法要求序列为排过序的:

      lower_bound,upper_bound,equal_range,binary_search。 binary_search用二分查找法查找一个元素是否存在,返回true或false。

      merge合并两个sorted的序列。

      inplace_merge,若一个序列用[first,last)表示,[first,middle)和[middle,last)都是sorted,那么inplace_merge可以将这个序列整体排序。

      set_union合并两个sorted序列,去掉重复的元素

      set_intersection 取得两个序列的交集

      set_difference    取得两个序列的差集

      set_symmetric_difference  相当于 set_difference(set_union,set_intersection)

      includes :测试一个sorted序列是否包含另一个sorted序列

      

       

       

 

       

     

posted @ 2012-08-13 15:40  vsuu  阅读(192)  评论(0编辑  收藏  举报