![](https://img-blog.csdnimg.cn/20210123201054273.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
c++标准库中的算法
c++标准库中的算法,根据《c++ primer》的附录中列出的算法整理。
友善啊,朋友
这个作者很懒,什么都没留下…
展开
-
C++标准库算法整理
此代码首先对{1, 2, 3, 4, 5}的每个元素执行square即平方操作,得到{1, 4, 9, 16, 25},再对此序列中的元素执行plus即相加的操作。移除指定范围内的元素,返回一个新的范围,其中被移除的元素被放置在范围的末尾。用于将元素的值从一个范围内的位置移动到另一个范围内的位置,并保持原始顺序的逆序。结果是计算出一个新的序列,新序列中的每个元素都是原序列中当前位置以及之前位置的元素的累积和。c++17以上才支持。将指定范围内的元素插入到容器中,并调整剩余元素的顺序,使其符合堆的规则。原创 2023-10-17 22:43:47 · 1917 阅读 · 0 评论 -
泛型算法:对象自增后赋给序列中的元素算法iota()
#define debug qDebug()<<int main(int argc, char *argv[]){ QList<int> list1{26,33,44,66,77}; int init = 0; std::iota(list1.begin(),list1.end(),init); debug list1;}这里init = 0赋给第一个元素,然后++init后赋给下一个元素。(不影响原来的init的值)对于自定义的数.原创 2021-01-23 15:35:40 · 176 阅读 · 0 评论 -
泛型算法:字典序比较算法lexicographical_compare()
#define debug qDebug()<<int main(int argc, char *argv[]){ QList<int> list1{26,33,44,66,77,99,33}; QList<int> list2{26,33,44,66,777}; auto result = std::lexicographical_compare(list1.begin(),list1.end(),list2.begin(),list2.e.原创 2021-01-23 14:11:01 · 206 阅读 · 0 评论 -
泛型算法:最值算法max()、min()、minmax() | 获取序列的最值算法min_element()、max_element()、minmax_element()
算法要求两个实参类型完全一致。1、max()和min()#define debug qDebug()<<int main(int argc, char *argv[]){ QList<int> list1{26,33,44,66,77,99,33}; QList<int> list2{22,33,44,66,777}; auto result = std::max(list1,list2,[](const QList<int&g原创 2021-01-23 13:49:22 · 611 阅读 · 0 评论 -
泛型算法:有序序列的集合算法includes()、set_union()、set_intersection()、set_difference()、set_symmetric_difference()
#define debug qDebug()<<int main(int argc, char *argv[]){ QList<int> list1{22,33,44,66,77,99,33}; QList<int> list2{22,33,44,66}; auto result = std::includes(list1.begin(),list1.end(),list2.begin(),list2.end()); debug re.原创 2021-01-21 23:16:22 · 257 阅读 · 0 评论 -
泛型算法:排列相关算法is_permutation()、next_permutation()、prev_permutation()
排列的数学定义:从n个不同元素中取出m(m≤n)个元素,按照一定的顺序排成一列,叫做从n个元素中取出m个元素的一个排列。特别地,当m=n时,这个排列被称作全排列。序列中的排列:一个没有重复元素的序列A,序列A的每个元素在序列B中都能找到,那序列A就是序列B的一种排列。(序列B可以有重复元素)1、is_permutation()判断序列是否是另一序列的排列int main(int argc, char *argv[]){ QVector<int> vec {1,2,3,4.原创 2021-01-21 22:43:30 · 318 阅读 · 0 评论 -
泛型算法:打乱序列算法shuffle()
#define debug qDebug()<<int main(int argc, char *argv[]){ srand(time(0)); QVector<int> vec{1,2,3,4,5,6,7,8,9}; debug vec; unsigned seed = std::chrono::system_clock::now ().time_since_epoch ().count (); std::shuffle(vec...原创 2021-01-20 23:12:05 · 488 阅读 · 0 评论 -
泛型算法:翻转序列算法reverse()、reverse_copy()
1、reverse()#define debug qDebug()<<int main(int argc, char *argv[]){ QVector<int> vec{1,2,3,4,5,6,7,8,9}; debug vec; std::reverse(vec.begin(),vec.end()); debug vec;}2、reverse_copy() 不改变原序列,翻转后复制到新序列#define debug qDe原创 2021-01-20 22:28:00 · 888 阅读 · 0 评论 -
泛型算法:旋转序列算法rotate()、rotate_copy()
1、rotate()int main(int argc, char *argv[]){ QVector<int> vec{1,2,3,4,5,6,7,8,9}; qDebug()<< vec; auto result = std::rotate(vec.begin(),vec.begin() + 3,vec.end()); qDebug()<< vec; qDebug()<< *result;}旋转类.原创 2021-01-20 13:40:05 · 335 阅读 · 0 评论 -
泛型算法:重排(删除)相邻重复元素算法unique()、unique_copy()
1、unique()将相邻重复元素移到序列后面,并用后面的元素替换它#define debug qDebug()<<int main(int argc, char *argv[]){ QVector<int> vec{3,3,2,5,1,1,6,9,3,4,7,7,3,4,88,99}; debug vec; std::unique(vec.begin(), vec.end()); debug vec;}先将相邻重复元素移到序列后面原创 2021-01-19 23:41:19 · 435 阅读 · 0 评论 -
泛型算法:重排(删除)元素算法remove()、remove_if()、remove_copy()、remove_copy_if()
1、remove() 将指定元素移到序列后面,并用后面的元素替换它,常用来与erase()配合删除元素。#define debug qDebug()<<int main(int argc, char *argv[]){ QVector<int> vec{3,2,5,1,6,9,3,4,7,3,4,88,99}; debug vec; std::remove(vec.begin(), vec.end(),3); debug vec;}原创 2021-01-18 23:55:31 · 453 阅读 · 0 评论 -
泛型算法:不完全排序nth_element()
#define debug qDebug()<<int main(int argc, char *argv[]){ QVector<int> vec{3,2,5,1,6,9,4,7}; std::nth_element(vec.begin(), vec.begin() + 4, vec.end()); debug vec;}要对序列进行完全排序是这样的:nth_element()保证:1、*(vec.begin() + 4) = ..原创 2021-01-17 22:40:54 · 314 阅读 · 0 评论 -
泛型算法:部分排序算法partial_sort()、partial_sort_copy()
1、partial_sort()对部分个数元素进行排序并移到序列前面#define debug qDebug()<<int main(int argc, char *argv[]){ QVector<int> vec{ 3,2,5,4,1,6,9,7}; std::partial_sort(vec.begin(), vec.begin() + 4, vec.end()); debug vec;}默认是升序排列,可以理解为从整个序列取出了最原创 2021-01-17 22:09:54 · 297 阅读 · 0 评论 -
泛型算法:查找初始最长有序子序列算法is_sorted_until()
#define debug qDebug()<<int main(int argc, char *argv[]){ QList<int> list = {8, 9, 10, 1, 2, 3, 4, 5, 6}; auto result = std::is_sorted_until(list.begin(), list.end()); debug *result;}从开头开始查找最长的有序子序列。返回该子序列的end迭代器。...原创 2021-01-17 15:45:47 · 137 阅读 · 0 评论 -
泛型算法:判断序列是否有序is_sorted()
#define debug qDebug()<<int main(int argc, char *argv[]){ QList<int> list = {8, 9, 1, 2, 3, 4, 5, 6}; bool result; result = std::is_sorted(list.begin(), list.end()); debug result;}is_sorted()还有第三个参数作为排序规则的版本,不缀诉。排序算法sor.原创 2021-01-17 15:37:12 · 278 阅读 · 0 评论 -
泛型算法:根据是否满足条件划分算法is_partitioned()、partition_copy()、partition_point()、stable_partition()、partition()
1、is_partitioned()一个序列中如果满足某一条件的元素全都都在前面、不满足该条件的元素全部在后面则is_partitioned()返回true,否则返回false。#define debug qDebug()<<int main(int argc, char *argv[]){ QList<int> list = {8, 9, 1, 2, 3, 4, 5, 6}; bool result; result = std::is_part原创 2021-01-17 14:49:05 · 279 阅读 · 0 评论 -
泛型算法:将两个有序的子序列合并成一个有序的子序列算法inplace_merge()
inplace_merge(begin,mid,end)要求begin~mid,mid~end之间分别有序。#define debug qDebug()<<int main(int argc, char *argv[]){ QList<int> list1; list1 << 66 << 6 << 9 << 11 << 1 << 3 << 4 << 5 <&原创 2021-01-16 20:27:01 · 224 阅读 · 0 评论 -
泛型算法:交换两个容器元素算法iter_swap()、swap_ranges()
1、交换两个容器指定位置的元素:iter_swap()#define debug qDebug()<<int main(int argc, char *argv[]){ QList<int> list1,list2; QRandomGenerator * rander = QRandomGenerator::global(); for (int var = 0; var < 3; ++var) { list1 <&原创 2021-01-16 16:24:18 · 333 阅读 · 0 评论 -
泛型算法:合并两个有序序列算法:merge()
1、版本1:根据元素的“<”运算符比较元素#define debug qDebug()<<int main(int argc, char *argv[]){ QList<int> list1,list2,list3; QRandomGenerator * rander = QRandomGenerator::global(); for (int var = 0; var < 10; ++var) { list1 &原创 2021-01-16 15:51:27 · 459 阅读 · 0 评论 -
泛型算法:处理容器元素并将结果存到另外容器的算法transform()
QStringList list; auto it = std::inserter(list,list.begin());//每次插入将在begin()处插入 for(int i = 0;i < 5;++i) { *it = QString("xx%1").arg(i); ++it; } QStringList list2; std::transform(list.begin(),list.end(),std:...原创 2021-01-13 23:25:32 · 159 阅读 · 0 评论 -
泛型算法:将容器中一定范围的值做替换算法generate()、generate_n()
1、generate()generate()能够将容器中一定范围的值替换成指定的值。对空容器不起作用。 QStringList list; auto it = std::inserter(list,list.begin());//每次插入将在begin()处插入 for(int i = 0;i < 5;++i) { *it = QString("xx"); ++it; } qDebug()<<list原创 2021-01-11 13:02:25 · 208 阅读 · 0 评论 -
插入迭代器
插入迭代器用于向容器中添加数据。 QJsonArray array; auto it = std::back_inserter(array); for(int i = 0;i < 5;++i) { QJsonObject obj; obj["index"] = i; *it = obj; ++it; } for(int i = 0;i < array.size();++i)原创 2020-12-26 15:55:25 · 220 阅读 · 0 评论 -
泛型算法:二分查找算法lower_bound()、upper_bound()、equal_range()、binary_search()
反之如果查找失败,则这 2 个迭代器要么都指向大于 val 的第一个元素(如果有),要么都和 迭代器2指向相同。这里比较是否相等是判断:如果c1 < c2不成立且c2 < c1不成立则c1和c2相等。类似lower_bound(),upper_bound() 函数返回一个迭代器,指向第一个。如果容器中不存在不小于给定值的元素,则返回指向容器末尾的迭代器。如果容器中不存在大于给定值的元素,则返回指向容器末尾的迭代器。这里自定义小于规则:比较结构体的second,second小的就认为元素较小。原创 2021-01-11 00:15:08 · 1071 阅读 · 0 评论 -
泛型算法:比较两个序列匹配算法mismatch()
两个序列比较,返回pair的值分情况是不同的:1、两个序列的值不匹配:pair的first是序列1的第一个不匹配的元素,second是序列2的第一个不匹配的元素: QStringList list1; list1<<"aa"<<"bb"<<"cc"<<"dd"<<"aa"<<"ab"<<"ac"<<"bb"<<"cc"<<"dd"<<"aa"; .原创 2021-01-10 16:14:00 · 766 阅读 · 0 评论 -
泛型算法:对容器中每个元素操作算法for_each() [实用!!!]
例1: QStringList list2; list2<<"bb"<<"cc"<<"tt"; std::for_each(list2.begin(),list2.end(),[](const QString & str) { qDebug()<<str; }); std::for_each(list2.begin(),list2.end(),[](QString & s.原创 2021-01-10 14:59:29 · 279 阅读 · 0 评论 -
泛型算法:获取序列中元素在另一序列中第一次出现位置算法find_first_of()
QStringList list1; list1<<"aa"<<"bb"<<"cc"<<"dd"<<"aa"<<"ab"<<"ac"; QStringList list2; list2<<"bb"<<"aa"<<"ab"; auto result = std::find_first_of(list1.begin(),list1.end(),lis...原创 2021-01-10 13:31:14 · 195 阅读 · 0 评论 -
泛型算法:判断/查找子序列算法search()、find_end()
search()有两个版本 QStringList list1; list1<<"aa"<<"bb"<<"cc"<<"dd"<<"aa"<<"ab"<<"ac"; QStringList list2; list2<<"dd"<<"aa"<<"ab"; auto result = std::search(list1.begin(),list1.e原创 2021-01-10 13:19:51 · 455 阅读 · 0 评论 -
泛型算法:查找相邻重复值算法adjacent_find() 、search_n()
adjacent_find() 返回容器中第一个相邻的重复值。adjacent_find()有两个版本:判断重复(相等)依据是数据类型的“==”运算符。 QStringList list; list<<"aa"<<"bb"<<"cc"<<"dd"<<"aa"<<"ee"<<"ee"<<"kk"<<"kk"; auto result = std::adjacent_fi原创 2021-01-05 23:27:15 · 526 阅读 · 0 评论 -
泛型算法:判断是否有元素满足条件算法any_of()、 none_of()、all_of()
1、any_of() 是否有满足条件的元素 QStringList list; list<<"aa"<<"bb"<<"cc"<<"dd"<<"aa"; bool b = std::any_of(list.begin(),list.end(),[](const QString & string) { return string == "cc"; }); qDebug()<原创 2021-01-05 22:55:05 · 441 阅读 · 0 评论 -
泛型算法:容器元素计数算法count()、count_if()
1、count() QStringList list; list<<"aa"<<"bb"<<"cc"<<"dd"<<"aa"; auto result = std::count(list.begin(),list.end(),"aa"); qDebug()<<result;计算元素出现次数,自定义数据类型要重载“==运算符”。2、count_if() 满足条件的元素计数 ..原创 2021-01-05 13:26:18 · 480 阅读 · 0 评论 -
泛型算法:按条件查找元素算法find_if()、find_if_not()
泛型算法:查找元素算法find()find()元素查找时判定元素相等依赖于元素自身“==”的操作。相比之下,find_if()函数可以依据自定义的查找条件来查找元素。find_if()返回第一符合条件的元素。 QStringList list; list<<"aa"<<"bb"<<"cc"<<"dd"<<"cc"<<"dd"; auto findIfResult = std::find_if(list原创 2020-12-31 12:52:27 · 502 阅读 · 0 评论 -
泛型算法:容器相邻重复元素去除算法unique()
unique()函数只能对相邻的元素进行去重操作,所以在使用之前要排序。对于自定义元素要重载"=="运算符,因为去重要有判断重复的标准。struct ceshi{ int frist = 0; int second = 0; bool operator==(const ceshi &b) const { if(b.frist == this->frist && b.second == this->second)原创 2020-12-30 22:49:51 · 441 阅读 · 0 评论 -
泛型算法:整个范围排序算法sort()、stable_sort()
1、sort()对于自定义类型,如果没有重载“<”运算符,那么使用sort()时要指定一个排序的函数。struct ceshi{ int frist = 0; int second = 0;};int main(int argc, char *argv[]){ QList<ceshi> list; ceshi c1; c1.frist = 1; c1.second = 2; ceshi c2; c2.fri原创 2020-12-29 22:51:32 · 403 阅读 · 0 评论 -
泛型算法:替换算法replace()、replace_if()、replace_copy()、replace_copy_if()
1、replace()自定义数据类型使用replace()的前提是重载了"=="运算符。struct ceshi{ int frist = 0; int second = 0; bool operator==(const ceshi &b) const { if(b.frist == this->frist && b.second == this->second) return true.原创 2020-12-28 13:29:39 · 791 阅读 · 0 评论 -
泛型算法:拷贝算法copy()、copy_n()、copy_if()、copy_backward()
struct ceshi{ int frist = 0; int second = 0;};int main(int argc, char *argv[]){ QList<ceshi> list; ceshi c1; c1.frist = 1; c1.second = 2; ceshi c2; c2.frist = 3; c2.second = 4; list << c1 << c.原创 2020-12-28 12:56:23 · 674 阅读 · 0 评论 -
泛型算法:赋值算法fill()和fill_n()
fill()算法的参数,前两个是迭代器,要赋值的范围,第三个是要赋的值。 QJsonArray array; array.append(QJsonObject()); array.append(QJsonObject()); array.append(QJsonObject()); array.append(QJsonObject()); QJsonObject obj; obj["AA"] = "BB"; std::fill(std::原创 2020-12-25 13:29:37 · 403 阅读 · 0 评论 -
泛型算法:判断序列相等算法equal()
equal()算法用来比较两个序列是否相等equal(序列1首元素迭代器,序列1尾元素后面的位置的迭代器,序列2首元素迭代器)序列1和序列2可以是不同类型的序列。比较的前提是元素可以使用“==”比较,对于自定义的数据,必须重载“==运算符”。struct ceshi{ int frist = 0; int second = 0; bool operator==(const ceshi &b) const { if(b.frist ==原创 2020-12-23 22:58:09 · 780 阅读 · 0 评论 -
泛型算法:数值操作算法accumulate()、inner_product()、partial_sum()、adjacent_difference()
头文件:#include <numeric>accumulate(start迭代器,end迭代器,和的初值)使用这个算法的前提是该类型可以使用“+”运算,求和的结果保存在第三个参数中 QStringList list; list <<"aa" <<"bb" <<"cc" << "dd"; auto result = std::accumulate(std::begin(list),std::end(list),Q原创 2020-12-23 13:33:21 · 488 阅读 · 0 评论 -
泛型算法:查找元素算法find()
std::vector<int> vec{1,2,3,4,5,6}; auto result = std::find(vec.begin(),vec.end(),99); qDebug()<<"查找结果"<< (result == vec.end());前两个参数是迭代器,没找到则返回第二个参数,所以用result == vec.end()判断查找结果。QT的容器也能用: QStringList list; list...原创 2020-12-22 23:03:14 · 712 阅读 · 0 评论