所有的区间都表示为[a,b)
关于区间的一些忠告:
[a,b)标识的区间必须隶属于同一容器(标识的范围可以是容器的子集)
如果a,b不是同一容器的迭代器位置,那么,可能造成死循环,甚至
访问进程外的其他非法地址,引起程序崩溃。传参时,要仔细。区间一定要有效
什么样的区间才叫有效呢?
1比如你想处理[x,y],则传入的区间应该是[x,y+1)
2一定要确保a相对有b在前。
比如当a,b范围的迭代器时随机的,则判断a相对于b在前,可以使用operator<
随机迭代器:a<b <<==>>a相对b在前
#include <algorithm>
求区间内的最小值(第一个最小值的位置)
template <typename InputIterator>
InputIteraor min_elememt(InputIterator a,InputIterator b);
求区间内的最大值(第一个最大值的位置)
template <typename InputIteraor>
InputIterator max_element(InputIterator a,InputIterator b);
求区间内第一个元素为key的迭代器位置
template <typename InputIterator ,typename T>
InputIterator find(InputIterator a,InpiutIterator b,const T& key);
将区间修改为反向顺序
template <typename OutputIterator>
void reverse(OutputIterator a,OutputIterator b);
将区间内的元素排序(默认升序=operator<=less<T>,否则降序=operator>=greater<T>)
template <typename InputIterator,...>
void sort(InputIterator a,InputIterator b);
template <typename InputIterator>
size_t distance(InputIterator a,InputIterator b);
测量[a,b)之间的距离(元素个数)
2同时处理多个区间的算法:
对于同时处理多个区间的算法,必须给出一组完整的区间,用以标识第一个
区间的范围。其他区间秩序给出起点即可。因为,其他区间上的处理取决于
第一区间的元素个数。比如,区间范围的比较大小、copy、涂改目标区间等算法
一个准则是:目标区间要足够大,至少要和第一区间一样大
比较两区间的大小:2.1
template <typename InputIterator>
bool equal_to(InputIterator a1,InputIterator b1, InputIterator a2);
把[a1,b1)拷贝到[dest,..):2.2
这是把[a1,b1)拷贝(覆盖)到dest,并非安插到dest。所以copy前
dest要有足够的空间存放。
template <typename InputIterator>
void copy(InputIterator a1,InputIterator b1,InputIteraor dest)
唯一拷贝2.3
template <typename InputIterator >
void unique_copy(InputIterator a,InputIterator b,InputIterator dest);
把区间[a,b)表示的串无重复地拷贝到dest所在的区间。
由于由涉及到覆盖而不是安插。所以dest的范围要至少和[a,b)一样大
3修改类算法
修改类泛型算法不适用于关联容器。如果真要修改关联容器。用sTL提供的
成员函数去完成修改操作。对关联容器应用泛型的修改类算法,会导致编译错误
3.1 remove 算法:
template <typename InputIterator>
InputIterator remove(InputIterator a,InputIterator b,const ElemType& elem);
把区间[a,b)中的值为elem的元素删除,并且返回含有删除元素的地址end
真正含有elem的子区间为[end,list<T>::end());