C++模板实战7:标准库算法

本文详细介绍了C++标准库中的各种算法,包括搜索、计数与比较、复制/交换/替换/删除、排序、二分搜索、集合运算、二叉堆操作以及其他常用算法。这些算法使用函数模板实现,提供了高效、灵活的序列操作方式,如find、count、sort、binary_search、merge等。同时,还提及了函数对象基类和运算函数对象,如bind和mem_fn的使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    标准库算法是函数模板,在这里列举部分库算法:

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值