c++一些常见的算法,数值运算使用方法

本文详细介绍了C++标准模板库(STL)中的多种函数,如sort()进行排序、swap()交换变量值、find()系列查找、lower_bound()和upper_bound()进行区间查找,以及math和numeric库中的数学和数值算法。重点讲解了如何提高代码可读性和效率。
摘要由CSDN通过智能技术生成


库函数:很多函数的功能很简单,自己都能快速写出来,但是使用函数可以让代码可读性变得更高

算法库 #include<algorithm>
(1)sort()排序函数-基于快速排序
void sort(first,end,cmp);
解释:该函数专门用来对容器或普通数组中指定范围内的元素进行排序,排序规则默认以元素值的大小做升序排序,
除此之外我们也可以选择标准库提供的其它排序规则(比如std::greater<T>降序排序规则),甚至还可以自定义排序规则。

注意事项:容器支持的迭代器类型必须为随机访问迭代器。这意味着,sort() 只对 array、vector、deque 这 3 个容器提供支持。
sort() 函数在实现排序时,需要交换容器中元素的存储位置。这种情况下,如果容器中存储的是自定义的类对象,则该类的内部必须提供移动构造函数和移动赋值运算符。

(2)swap()函数
交换两个变量的值
template< class T >
void swap( T& a, T& b );

(3)find()函数族
1.InputIterator find (InputIterator first, InputIterator last, const T& val);
//函数会返回一个输入迭代器,当 find() 函数查找成功时,其指向的是在 [first, last) 区域内查找到的第一个目标元素;如果查找失败,则该迭代器的指向和 last 相同。
find() 函数除了可以作用于序列式容器,还可以作用于普通数组。

2.ForwardIterator find_end (ForwardIterator first1, ForwardIterator last1,
                          ForwardIterator first2, ForwardIterator last2);
//查找序列 [first1, last1) 中最后一个子序列 [first2, last2)

3.InputIterator find_first_of (InputIterator first1, InputIterator last1,
                             ForwardIterator first2, ForwardIterator last2);
//在 A 序列中查找和 B 序列中任意元素相匹配的第一个元素
char url[] = "http://c.biancheng.net/stl/";
    char ch[] = "stl";
    //找到 url 中和 "stl" 任一字符相同的第一个字符
    char *it = find_first_of(url, url + 27, ch, ch + 4);

(4)lower_bound() / upper_bound()
在已升序排序的元素中,应用二分查找检索指定元素,返回对应元素迭代器位置。找不到则返回尾迭代器。
lower_bound(): 寻找>=x的第一个元素的位置
upper_bound(): 寻找>x的第一个元素的位置

怎么找 <=x/<x的第一个元素呢
>x的第一个元素的前一个元素(如果有)便是<=x的第一个元素
>=x的第一个元素的前一个元素(如果有)便是<x的第一个元素

构造与示例:
template< class ForwardIt, class T >
ForwardIt lower_bound( ForwardIt first, ForwardIt last, const T& value );

vector<int> arr{0, 1, 1, 1, 8, 9, 9};
vector<int>::iterator it = lower_bound(arr.begin(), arr.end(), 7);
int idx = it - arr.begin();
// idx = 4

(5)reverse()-反转一个可迭代对象的元素顺序
用法:
template< class BidirIt >
void reverse( BidirIt first, BidirIt last );

(6)max(),min()
返回最大值/最小值
int mx = max({1, 2, 3, 4}); // 4
int mn = min({1, 2, 3, 4}); // 1

(7)unique()
消除数组的重复相邻元素,数组长度不变,但是有效数据缩短,返回的是有效数据位置的结尾迭代器。
template< class ForwardIt >
ForwardIt unique( ForwardIt first, ForwardIt last );

单独使用 unique 并不能达成去重效果,因为它只消除相邻的重复元素。但是如果序列有序,那么它就能去重了。
但是它去重后,序列尾部会产生一些无效数据:$[1,1,2,4,4,4,5]\to[1,2,4,5,\underline?,?,?]$,为了删掉这些无效数据,我们需要结合 erase.

例如,给 vector 去重的写法便是:
vector<int> arr{1, 2, 1, 4, 5, 4, 4};
sort(arr.begin(), arr.end());
arr.erase(unique(arr.begin(), arr.end()), arr.end());

(8)remove(first,end,val);
会删除first,end中间值为val的值,但是并不能直接改变容器的大小,要配合容器的erase函数一起使用(与unique函数一样)
试用于vector,string等


(9)max_element(first,end),min_element(first,end);
求first,end中的最大值、最小值

(10)count(ivec.begin() , ivec.end() , searchValue);
函数使用一对迭代器和一个值做参数,返回这个值出现次数的统计结果。作用:可以求一个特定值的个数,比较方便
但是对于那种一个一个输入的值,用map形式的数组++更好,例如int a[5];a[3]++;


数学函数 #include<cmath>
下面函数均支持int / long long / float / double / long double类型数据
(1)绝对值abs(val),fbs(val),若abs()不支持浮点型,换用fbs()
(2)指数函数exp(x)
(3)对数函数log(x)
(4)求幂pow(x,y)
(5)开方sqrt(val)
(6)顶函数(向上取整)ceil(float x)
(7)底函数(向下取整)floor(float x)
(8)四舍五入 round(val)

如果操作类型都为int型,有些地方这么用更保险:
向下取整:a/b
向上取整:(a+b-1)/b
log2(a)(向下取整):bit_width()


数值算法 #include<numeric>
(1)gcd()最大公约数
(2)lcm()最小公倍数
int x = gcd(8, 12); // 4
int y = lcm(8, 12); // 24

字符类型 #include <ctype.h>
isalpha()用来判断一个字符是否为字母
isalnum用来判断一个字符是否为数字或者字母,也就是说判断一个字符是否属于a~ z||A~ Z||0~9。
isdigit() 用来检测一个字符是否是十进制数字0-9
islower()用来判断一个字符是否为小写字母,也就是是否属于a~z。
isupper()和islower相反,用来判断一个字符是否为大写字母。
以上如果满足相应条件则返回非零,否则返回零。
 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值