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序列