C++ algorithm 实用向总结

本文是面向新手的C++算法函数实用总结,主要讲解了如何使用、等函数,涉及概念澄清、比较标准设定以及排序和查找操作。文章强调了在自定义数据类型中建立比较逻辑的重要性,并给出了函数应用实例。

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

C++ <algorithm>实用向总结

注 :本篇文章属于新手实用向 ,只针对算法函数的简单使用方法进行介绍 。
如有错误 ,欢迎指正 。

一、概念澄清

  1. 本文会大量提到“存在逻辑大小”和“不存在逻辑大小”这两个词 ,在这里做一些说明 。
  • 存在逻辑大小 :指本身存在大小关系 ,可以直接比较的变量 。比如int型、float型、char型 等等 。3 < 58.8 > 7.1'c' > 'a'…… ……
  • 不存在逻辑大小 :主要是指用户自定义的数据类型 。比如 ,自定义一个student结构体,包括两个数据成员namescore,用student定义两个变量stu1stu2,这两个变量,本身没有大小关系的逻辑,因为没有比较标准
  1. cmp函数简要说明 。

cmp函数,其实就是用户自定义的一个比较标准 。它的用途主要有二 :

  • 给不存在逻辑大小的变量(例如结构体变量)树立比较标准 ,从而可以进行比较 。
  • 改变原有的比较标准 ,树立新标准 。(例如原本sort函数默认从小到大排序 ,如果要改为从大到小排序 ,就可以用cmp函数)

cmp函数的写法 :

bool cmp(const Type1 &a,const Type2 &b){
  return  a.i<b.i;  //此处是一个符合自己意愿的逻辑表达式即可
}

二、函数的使用

注 :以下只介绍 5种简单的函数 。所有函数使用之前应包含头文件<algorithm>并使用标准命名空间std

#include <algorithm>
#include <iostream>
using namespace std;

1 . maxmin系列函数

以下用a,b表示两个元素 ,用BeginEnd表示一个范围的开头和结尾 。

max(a,b)  //返回a,b中较大者
max_element(Begin,End,cmp)  //( cmp 可不填)(按照 cmp 的标准)返回范围内最大者或最大者的迭代器
min(a,b)  //返回a,b中较小者
min_element(Begin,End,cmp)  //( cmp 可不填)(按照 cmp 的标准)返回范围内最小者或最小者的迭代器

2 . sort系列函数

以下用BeginEnd表示一个范围的开头和结尾 。并且End表示要排序的末尾元素的下一个位置 。

sort(Begin,End)  //对范围内元素进行排序(默认从小到大)
sort(Begin,End,cmp)  //按照 cmp 的标准排序
is_sorted(Begin,End)  //检查范围内元素是否已排序 (默认从小到大),若已排序则返回 true
is_sorted(Begin,End,cmp)  //  按照 cmp 的标准检查范围内元素是否已排序 , 若已排序则返回 true

3 . swap系列函数

以下ab可代表两个变量 ,两个数组 ,两个容器 ,两个迭代器等 。

swap(a,b)  //交换a和b的元素
swap(aBegin,aEnd,bBegin)  //交换a与b中从aBegin到aEnd之间的元素
iter_swap(a,b)  //交换两个迭代器a和b所指向的元素

4 . lower_boundupper_bound函数

以下用BeginEnd表示一个范围的开头和结尾 。并且End表示被查找的末尾元素的下一个位置 ;用num表示要查找的元素 。并且必须保证范围内的元素已经排好序 。

lower_bound(Begin,End,num)  //返回>=num的第一个元素的位置的指针或迭代器 。如果所有元素都小于num ,则返回End 。    
upper_bound(Begin,End,num)  //返回<=num的第一个元素的位置的指针或迭代器 。如果所有元素都大于num ,则返回End 。                                                                                          

使用技巧 :通过返回的地址减去起始地址Begin,得到找到数字在数组(或容器)中的下标。

5 . transform函数

  • 一元转换 :将一元函数(用op1表示)应用于容器1(或数组1)中的每一个元素,并将结果储存于容器2(或数组2)内 。容器2(或数组2)可与容器1(或数组1)是同一个容器(或数组)。
transform(Begin_1,End_1,Begin_2,op1)  //对Begin_1到End_1内的元素应用op1函数 ,并将结果保存至以Begin_2开头的容器(或数组)内 。
  • 二元转换 :将二元函数(用op2表示)应用于容器1(或数组1)和容器2(或数组2)中的每一个元素,并将结果储存于容器3(或数组3)内 。容器3(或数组3)可与容器1(或数组1),容器2(或数组2)是同一个容器(或数组)。
transform(Begin_1,End_1,Begin_2,Begin_3,op2)  //对Begin_1到End_1及从Beign_2开始的元素应用op2函数 ,并将结果保存至以Begin_3开头的容器(或数组)内 。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值