非修改性序列操作(12个)
循环
 | 
 | 
| 对序列中的每个元素执行某操作 | 
for_each() | 
查找
 | 
 | 
| 在序列中找出某个值的第一次出现的位置 | 
find() | 
| 在序列中找出符合某谓词的第一个元素 | 
find_if() | 
| 在序列中找出一子序列的最后一次出现的位置 | 
find_end() | 
| 在序列中找出第一次出现指定值集中之值的位置 | 
find_first_of() | 
| 在序列中找出相邻的一对值 | 
adjacent_find() | 
计数
 | 
 | 
| 在序列中统计某个值出现的次数 | 
count() | 
| 在序列中统计与某谓词匹配的次数 | 
count_if() | 
比较
 | 
 | 
| 找出两个序列相异的第一个元素 | 
mismatch() | 
| 两个序列中的对应元素都相同时为真 | 
equal() | 
搜索
 | 
 | 
| 在序列中找出一子序列的第一次出现的位置 | 
search() | 
| 在序列中找出一值的连续n次出现的位置 | 
search_n() | 
修改性序列操作(27个)
复制
 | 
 | 
| 从序列的第一个元素起进行复制 | 
copy() | 
| 从序列的最后一个元素起进行复制 | 
copy_backward() | 
交换
 | 
 | 
| 交换两个元素 | 
swap() | 
| 交换指定范围的元素 | 
swap_ranges() | 
| 交换由迭代器所指的两个元素 | 
iter_swap() | 
变换
 | 
 | 
| 将某操作应用于指定范围的每个元素 | 
transform() | 
替换
 | 
 | 
| 用一个给定值替换一些值 | 
replace() | 
| 替换满足谓词的一些元素 | 
replace_if() | 
| 复制序列时用一给定值替换元素 | 
replace_copy() | 
| 复制序列时替换满足谓词的元素 | 
replace_copy_if() | 
填充
 | 
 | 
| 用一给定值取代所有元素 | 
fill() | 
| 用一给定值取代前n个元素 | 
fill_n() | 
生成
 | 
 | 
| 用一操作的结果取代所有元素 | 
generate() | 
| 用一操作的结果取代前n个元素 | 
generate_n() | 
删除
 | 
 | 
| 删除具有给定值的元素 | 
remove() | 
| 删除满足谓词的元素 | 
remove_if() | 
| 复制序列时删除具有给定值的元素 | 
remove_copy() | 
| 复制序列时删除满足谓词的元素 | 
remove_copy_if() | 
唯一
 | 
 | 
| 删除相邻的重复元素 | 
unique() | 
| 复制序列时删除相邻的重复元素 | 
unique_copy() | 
反转
 | 
 | 
| 反转元素的次序 | 
reverse() | 
| 复制序列时反转元素的次序 | 
reverse_copy() | 
环移
 | 
 | 
| 循环移动元素 | 
rotate() | 
| 复制序列时循环移动元素 | 
rotate_copy() | 
随机
 | 
 | 
| 采用均匀分布来随机移动元素 | 
random_shuffle() | 
划分
 | 
 | 
| 将满足某谓词的元素都放到前面 | 
partition() | 
| 将满足某谓词的元素都放到前面并维持原顺序 | 
stable_partition() | 
序列排序及相关操作(27个)
排序
 | 
 | 
| 以很好的平均效率排序 | 
sort() | 
| 排序,并维持相同元素的原有顺序 | 
stable_sort() | 
| 将序列的前一部分排好序 | 
partial_sort() | 
| 复制的同时将序列的前一部分排好序 | 
partial_sort_copy() | 
第n个元素
 | 
 | 
| 将第n各元素放到它的正确位置 | 
nth_element() | 
二分检索
 | 
 | 
| 找到大于等于某值的第一次出现 | 
lower_bound() | 
| 找到大于某值的第一次出现 | 
upper_bound() | 
| 找到(在不破坏顺序的前提下)可插入给定值的最大范围 | 
equal_range() | 
| 在有序序列中确定给定元素是否存在 | 
binary_search() | 
归并
 | 
 | 
| 归并两个有序序列 | 
merge() | 
| 归并两个接续的有序序列 | 
inplace_merge() | 
有序结构上的集合操作
 | 
 | 
| 一序列为另一序列的子序列时为真 | 
includes() | 
| 构造两个集合的有序并集 | 
set_union() | 
| 构造两个集合的有序交集 | 
set_intersection() | 
| 构造两个集合的有序差集 | 
set_difference() | 
| 构造两个集合的有序对称差集(并-交) | 
set_symmetric_difference() | 
堆操作
 | 
 | 
| 向堆中加入元素 | 
push_heap() | 
| 从堆中弹出元素 | 
pop_heap() | 
| 从序列构造堆 | 
make_heap() | 
| 给堆排序 | 
sort_heap() | 
最大和最小
 | 
 | 
| 两个值中较小的 | 
min() | 
| 两个值中较大的 | 
max() | 
| 序列中的最小元素 | 
min_element() | 
| 序列中的最大元素 | 
max_element() | 
词典比较
 | 
 | 
| 两个序列按字典序的第一个在前 | 
lexicographical_compare() | 
排列生成器
 | 
 | 
| 按字典序的下一个排列 | 
next_permutation() | 
| 按字典序的前一个排列 | 
prev_permutation() | 
函数对象类模板
| 函数对象类模板 | 
成员函数 T operator ( const T & x, const T & y) 的功能 | 
| plus  | 
return x + y; | 
| minus < > | 
return x - y; | 
| multiplies  | 
return x * y; | 
| divides  | 
return x / y; | 
| modulus  | 
return x % y; | 
 | 
 | 
 | 
成员函数 bool operator( const T & x, const T & y) 的功能 | 
| equal_to  | 
return x == y; | 
| not_equal_to  | 
return x! = y; | 
| greater  | 
return x > y; | 
| less  | 
return x < y; | 
| greater_equal  | 
return x > = y; | 
| less_equal  | 
return x <= y; | 
| logical_and  | 
return x && y; | 
| logical_or  | 
return x || y; | 
 | 
 | 
 | 
成员函数 T operator( const T & x) 的功能 | 
| negate  | 
return - x; | 
 | 
 | 
 | 
成员函数 bool operator( const T & x) 的功能 | 
| logical_not  | 
return ! x; | 
拓展
二分查找
template<class InputIterator, class T>
InputIterator bfind(InputIterator first, InputIterator end, const T& key)
{
    InputIterator l = first;
    InputIterator r = end-1;
    InputIterator mid;
    while(l <= r)
    {
        mid = l + distance(l, r)/2;
        if(*mid > key)
            r = mid - 1;
        else if(key  > *mid )
            l = mid + 1;
        else 
            return mid;
    }
    return end;
}
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main(int argc, char* argv[])
{
	vector<int> ivec { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
			17, 18, 19, 20 };
	vector<int>::iterator iter = bfind(ivec.begin(), ivec.end(), 4);
	if (iter != ivec.end())
		cout << *iter << endl;
	else
		cout << "not find" << endl;
    return 0;
}