标准库算法是函数模板,在这里列举部分库算法:
1 搜索算法都是成功时返回第一个满足条件的位置,失败时返回末端迭代器。
1) find(i,j,v)//搜索[i,j)中第一个等于val的位置
2) find_if(i,j,pred)//搜索序列[i,j)中第一个使pred为true的元素位置
3) find_if_not(i,j,pred)//搜索序列[i,j)中第一个使pred为false的元素位置
4) find_end(i0,j0,i1,j1)//搜索[i0,j0)中最后一个与[i1,j1)相同的子序列位置
5) find_end(i0,j0,i1,j1,bpred)//搜索[i0,j0)中最后一个是bpred为true的子序列[i1,j1),这里bpred是双目运算符
6) search(i0,j0,i1,j1)//搜索[i0,j0)中最后一个子序列[i1,j1)位置
7) search_n(i,j,n,v)//在[i0,j0)中搜索连续n个v的位置
8) adjacent_find(i,j)//搜索[i,j)中连续相邻两元素相等时的位置
9) adjacent_find(i,j,bpred)//搜索序列中首次前后相邻元素使得bpred为真的位置
2 计数与比较
1) count(i,j,v)//返回序列[i.j)中等于v的元素个数
2) count(i,j,pred)//返回序列中使pred为真的元素个数
3) mismatch(i,j,k)//找出[i,j)与以迭代器k为首的序列不相同的元素
4) mismatch(i,j,k,bpred)//将上面的相等用bpred代替
5) equal(i,j,k)//比较两个序列是否相等,若一一相等则返回true
6) equal(i,j,k,bpred)//若bpred都不返回fasle,则算法返回true,否则返回false
3 复制/交换/替换/删除
1) copy(i,j,k)//将[i,j)复制到另一个以迭代器k开头的序列中
2) copy_backward(i,j,k)//将[i.j)复制到末端迭代器k后
3) copy_n(i,j,k)//将i后的n个元素复制到k后面
4) copy_if(i,j,k,pred)//只复制序列[i,j)中使pred为真的元素到k后面
5) swap(a,b)//交换两个同类型的变量值
6) swap_ranges(i,j,k)//将[i.j)与以k开头的序列整体交换
7) iter_swap(i,j)//交换两个迭代器所指元素的内容
8) replace(i,j,old,new)//将序列中所有等于old的元素替换为new
9) replace_if(i,j,pred,new)//将序列中使pred为真的元素全部替换为new
10)replace(i,j,k,old,new)//相当于将[i.j)复制到k开头的序列中,再将等于old的替换为new
11) replace_copy_if(i,j,k,pred,new)//将上面的等于替换为运算符pred
12) remove(i,j,v)//将序列中[i,j)所有等于v的元素删除
13) remove_if(i,j,pred)//将序列中所有使pred为真的元素删除
4 排序
1) sort(i,j)//对序列[i.j)升序排列
2) partial_sort(i,j,k)//部分排序,保证[i.j)递增排序,并且[j,k)内任意元素大于[i,j)内任意元素,但不保证[j,k)内元素的排列顺序
3) is_sorted(i,j)//判断[i,j)是否有序
5 二分搜索
1) binary_search(i,j,v)//在序列中找到v则返回true
2) binary_search(i,j,v,pred)//在序列中找到满足pred条件的元素v
6 集合运算
1) includes(i0,j0,i1,j1)//序列[i0,j0)是否是[i1,j1)的子序列
2) set_union(i0,j0,i1,j1,k)//求出[i0,j0)和[i1,j1)的并集写入k
3) set_intersection(i0,j0,i1,j1,k)//求出两序列交集写入k
4) set_difference(i0,j0,i1,j1,k)//将[i0,j0)不在[i1,j1)中的元素写入以迭代器k开头的集合中
5) set_symmetric_difference(i0,j0,i1,j1,k)//对两集合求异,如对A、B求异=(A-B)交(B-A)
7 二叉堆操作
1) make_heap(i,j)//将[i.j)元素按照二叉堆形式重排
2) push_heap(i,j)//向堆序列插入数据
3) pop_heap(i,j)//弹出堆顶数据
4) sort_heap(i,j)//将堆序列重排为升序
5) is_heap(i,j)//判断一个序列是否为对序列
6) is_head_until(i,j)//找出一个包含首元素的最大子堆序列
8 其它算法
min/max
min_element/max_element //返回两个参数中较小者或较大者
transform//将序列中的元素进行运算后保存至另一个容器中
fill//将序列中全部元素赋以相同的值
fill_n//构造一个有n个指定值的序列
generate//序列全部赋值
generate_n//构造n值序列
unique//删除序列中连续重复值
reverse//逆序
reverse_copy//创建一个逆序序列
rotate//序列循环左移
rotate_copy//创建一个循环左移后的序列
random_shuffle//随机改变元素的序列
partition//将序列中元素划分为两部分,满足条件的在前半部分
stable_partition//划分后序列稳定
is_partitioned//判断序列是否是划分的
partition_copy//新建一个划分序列
partition_point//返回一个划分序列的划分点迭代器
merge//归并排序
inplace_merge//将一个前后两部分都有序的序列合并成一个整体有序序列
lexicographical_comparsision//按字典顺序比较两序列
next_permutation//遍历一个序列的所有排序
prev_permutation//推算出前一排列
is_permutation//判断两序列是否为置换序列
9 函数对象基类:unary_functuon<Arg,Result> ;binary_function<Arg0,Arg1,Result>是单目/双目函数对象基类模板,基类模板定义了若干描述函数参数及返回值的类型。
10 运算函数对象:less、greater、less_equal、greate_equal、equal_to、not_equal_to、plus、minus、multiplies、devides、modulus、negate、logical_and、logical_or、logical_not
11 bind/mem_fn是模板函数:bind可以绑定任意类函数为一个std::function,mem_fn可以接收引用或者指针生成函数对象。有点值得注意:bind在普通传值的时候会拷贝实参。实例如下:
#include <functional>
#include <iostream>
// 一个自定义的整数类
struct integer
{
int i;
integer(int i) : i(i){}
void incr_by(int j) {i += j;} // 自加成员函数
};
int main()
{
integer x(0); // x.i = 0;
integer *y = &x; // y指向x。
using namespace std::placeholders;
using namespace std;
auto f0 = bind(&integer::incr_by, _1, _2);
f0(x, 2); // x.incr_by(2)
cout << x.i << endl; // x.i = 2;
f0(y, 2); // y->incr_by(2)//接收指针
cout << x.i << endl; // x.i = 4;
auto f1 = bind(&integer::incr_by, x, _1);
f1(2); // x在f1中的副本.incr(2)
cout << x.i << endl; // x.i = 4;
auto f2 = bind(&integer::incr_by, ref(x), _1);
f2(2); // x.incr_by(2)
cout << x.i << endl; // x.i = 6;
auto f3 = bind(&integer::incr_by, &x, _1);
f3(2); // (&x)->incr_by(2)
cout << x.i << endl; // x.i = 8;
// 利用mem_fn将成员函数转换为函数对象。
auto f4 = mem_fn(&integer::incr_by);
f4(x, 2);
cout << x.i << endl; // x.i = 10;
f4(y, 2);
cout << x.i << endl; // x.i = 12;
}
程序输出:
2
4
4
6
8
10
12
bind还可以嵌套使用,但是_n是绝对位置而非相对位置,实例如下:
auto f=bind(plus<int>(),_1,bind(multiplies<int>(),_2,_3));//a+b*c