首页>资讯>正文
每日头条!STL-常用算法总结
2023-02-13 20:22:46    来源:腾讯云
STL-常用算法总结
算法主要由头文件,,组成是所有STL头文件中最大的一个,范围涉及到比较、交换、查找、遍历、复制、删除等体积很小,只包括几个在序列上面进行简单数学运算的模板函数定义了一些模板类,用来声明函数对象常用遍历算法for_each遍历for_each(iterator beg, iterator end, _func);//遍历容器beg//起始迭代器end//结束迭代器_func()//函数或函数对象

for_each是实际开发中最常用的遍历算法,需要熟练掌握

#include#include#includeusing namespace std;//普通函数void myPrint(int val){    cout << val << " ";}//仿函数class myPrint2{public:    void operator()(int val)    {        cout << val << " ";    }};int main(){    vectorv;    for (int i = 0; i < 10; i++)    {        v.push_back(i);    }    for_each(v.begin(), v.end(), myPrint);    cout << endl;    for_each(v.begin(), v.end(), myPrint2());    return 0;}

transform搬运

transform(iterator beg1, iterator end1, iterator beg2, _func);//搬运容器

beg1//源容器开始迭代器end1//源容器结束迭代器beg2//目标容器开始迭代器_func//函数或函数对象

搬运的目标容器必须提前开辟空间,否则无法正常搬运


【资料图】

#include#include#includeusing namespace std;class Transform{public:    int operator()(int val)    {        return val;    }};int main(){    vectorv;    for (int i = 0; i < 10; i++)    {        v.push_back(i);    }    vectorv2;    v2.resize(v.size());    transform(v.begin(), v.end(), v2.begin(), Transform());    for (vector::iterator it = v2.begin(); it != v2.end(); it++)    {        cout << *it << " ";    }    return 0;}

常用查找算法

find//查找元素find_if//按条件查找元素adjacent_find//查找相邻重复元素binary_search//二分查找法count//统计元素个数count_if//按条件统计元素个数find按值查找find(iterator beg, iterator end, value);//按值查找beg//开始迭代器end//结束迭代器value//查找的元素

返回一个迭代器,如果没有找到,返回end()

查找自定义数据类型需要重载==运算符,否则底层不知道如何对比

#include#include#includeusing namespace std;//查找内置数据类型void test01(){    vectorv;    for (int i = 0; i < 10; i++)    {        v.push_back(i);    }    //返回一个迭代器,如果没有找到,返回end()    vector::iterator it = find(v.begin(), v.end(), 5);    if (it == v.end())        cout << "没找到" << endl;    else        cout << "找到了" << *it << endl;}//查找自定义数据类型class Person{public:    Person(string name,int age)    {        this->m_age = age;        this->m_name = name;    }    //重载==运算符,让find知道如何对比Person类型数据    bool operator==(const Person& p)    {        if (p.m_age == this->m_age && p.m_name == this->m_name)            return true;        else            return false;    }    string m_name;    int m_age;};void test02(){    //准备数据    Person p1("A", 1);    Person p2("B", 2);    Person p3("C", 3);    Person p4("D", 4);    Person p5("E", 5);    //放入容器中    vectorp;    p.push_back(p1);    p.push_back(p2);    p.push_back(p3);    p.push_back(p4);    p.push_back(p5);    //查找    Person p6("A", 1);    vector::iterator it = find(p.begin(), p.end(), p6);    //输出,验证结果    if (it == p.end())        cout << "没找到" << endl;    else        cout << "找到了" << it->m_name << it->m_age << endl;}int main(){    test01();    test02();    return 0;}

find_if条件查找

find_if(iterator beg, iterator end, _Pred);

beg//开始迭代器#include#include#includeusing namespace std;//查找内置数据类型class GreaterFive{public: bool operator()(int v) { return v > 5; }};void test01(){ vectorv; for (int i = 0; i < 10; i++) { v.push_back(i); } vector::iterator it = find_if(v.begin(), v.end(), GreaterFive()); if (it == v.end()) cout << "没找到" << endl; else cout << "找到了" << *it << endl;}//查找自定义数据类型class Person{public: Person(string name, int age) { this->m_age = age; this->m_name = name; } string m_name; int m_age;};class GreaterThree{public: bool operator()(Person& p) { return p.m_age > 3; }};void test02(){ //准备数据 Person p1("A", 1); Person p2("B", 2); Person p3("C", 3); Person p4("D", 4); Person p5("E", 5); //放入容器中 vectorp; p.push_back(p1); p.push_back(p2); p.push_back(p3); p.push_back(p4); p.push_back(p5); //查找 vector::iterator it = find_if(p.begin(), p.end(), GreaterThree()); //输出,验证结果 if (it == p.end()) cout << "没找到" << endl; else cout << "找到了" << it->m_name << it->m_age << endl;}int main(){ test01(); test02(); return 0;}adjacent_find查找相邻重复元素如果查到,返回相邻重复元素的第一个位置的迭代器adjacent_find(iterator beg, iterator end)end//结束迭代器_Pred//函数或者谓词(返回bool数据类型的仿函数)beg//开始迭代器#include#include#includeusing namespace std;void test01(){ vectorv; for (int i = 0; i < 10; i++) { v.push_back(i); } v.push_back(5); vector::iterator it=adjacent_find(v.begin(), v.end()); if (it == v.end()) cout << "未找到相邻重复元素" << endl; else cout << "找到了相邻重复元素" << *it << endl;}int main(){ test01(); return 0;}binary_search二分查找bool binary_search(iterator beg, iterator end, value);end//结束迭代器查找指定的元素,查到返回true,否则返回false#include#include#includeusing namespace std;void test01(){ vectorv; for (int i = 0; i < 10; i++) { v.push_back(i); } cout << binary_search(v.begin(), v.end(), 5) << endl;}int main(){ test01(); return 0;}count统计对于统计自定义数据类型,需要重载==运算符#include#include#includeusing namespace std;//统计内置数据类型void test01(){ vectorv; v.push_back(10); v.push_back(20); v.push_back(10); cout << count(v.begin(), v.end(), 10) << endl;}//统计自定义数据类型class Person{public: Person(string name, int age) { this->m_name = name; this->m_age = age; } //需要重载==运算符 //底层要求加const bool operator==(const Person& p) { if (this->m_name == p.m_name) return true; } string m_name; int m_age;};void test02(){ Person p1("A", 1); Person p2("B", 2); Person p3("A", 3); Person p4("A", 4); vectorp; p.push_back(p1); p.push_back(p2); p.push_back(p3); cout << "与p4同名的元素个数" << count(p.begin(), p.end(), p4) << endl;}int main(){ test01(); test02(); return 0;}count_if条件统计按条件统计元素出现次数count_if(iterator beg, iterator end, _Pred);注意:在无序列表中不可用,如果是无序序列,结果未知beg//开始迭代器end//结束迭代器value//查找的元素beg//开始迭代器#include#include#includeusing namespace std;//统计内置数据类型class GreaterFive{public: bool operator()(int val) { return val > 5; }};void test01(){ vectorv; for (int i = 0; i < 10; i++) { v.push_back(i); } cout << count_if(v.begin(), v.end(), GreaterFive()) << endl;}//统计自定义数据类型class Person{public: Person(string name, int age) { this->m_name = name; this->m_age = age; } string m_name; int m_age;};class AgeGreaterTwo{public: bool operator()(const Person& p) { return p.m_age > 2; }};void test02(){ Person p1("A", 1); Person p2("B", 2); Person p3("A", 3); Person p4("A", 4); vectorp; p.push_back(p1); p.push_back(p2); p.push_back(p3); p.push_back(p4); //统计年龄大于2的人数 cout << count_if(p.begin(), p.end(), AgeGreaterTwo()) << endl;}int main(){ test01(); test02(); return 0;}常用排序算法end//结束迭代器_Pred//函数或者谓词(返回bool数据类型的仿函数)sort//对容器内元素进行排序random_shuffle//随机洗牌,将指定范围内的元素重新排序merge//容器元素合并,并储存到另一个容器中reverse//反转指定范围的元素sort排序sort(iterator beg, iterator end, _Pred)//排序beg//开始迭代器#include#include#includeusing namespace std;void test01(){ vectorv; for (int i = 0; i < 10; i++) { v.push_back(i); } //默认升序 sort(v.begin(), v.end()); for (vector::iterator it = v.begin(); it != v.end(); it++) { cout << *it << " " ; } cout << endl; //使用内建函数对象实现降序排列 sort(v.begin(), v.end(), greater()); for (vector::iterator it = v.begin(); it != v.end(); it++) { cout << *it << " "; }}int main(){ test01(); return 0;}random_shuffle随机洗牌random_shuffle(iterator beg, iterator end);//随机洗牌end//结束迭代器_Pred//函数或者谓词,可填可不填,不填则默认升序排列只需要提供开始迭代器和结束迭代器

srand((unsigned int)time(NULL));可以设置系统时间为随机数种子

#include#include#includeusing namespace std;void test01(){    vectorv;    for (int i = 0; i < 10; i++)    {        v.push_back(i);    }    random_shuffle(v.begin(), v.end());    for (vector::iterator it = v.begin(); it != v.end(); it++)    {        cout << *it << " " ;    }    cout << endl;}int main(){    test01();    return 0;}

merge合并

merge(iterator beg1, iterator end1, iterator beg2, iterator end2, dest);//将两个容器元素合并,并储存到另一个容器中

两个容器必须是有序的#include#include#includeusing namespace std;void Print(int val){ cout << val << " ";}void test01(){ vectorv1; vectorv2; for (int i = 0; i < 10; i++) { v1.push_back(i); v2.push_back(i + 1); } //目标容器 vectorv3; //目标容器需要提前开辟空间 v3.resize(v1.size() + v2.size()); merge(v1.begin(), v1.end(), v2.begin(), v2.end(), v3.begin()); //合并后仍然是有序容器 for_each(v3.begin(), v3.end(), Print);}int main(){ test01(); return 0;}reverse反转reverse(iterator beg, iterator end);//反转指定范围内的元素beg1//容器1开始迭代器end1//容器1结束迭代器beg2//容器2开始迭代器end2//容器2结束迭代器dest//目标容器开始迭代器beg//起始迭代器#include#include#includeusing namespace std;void Print(int val){ cout << val << " ";}void test01(){ vectorv1; for (int i = 0; i < 10; i++) { v1.push_back(i); } for_each(v1.begin(), v1.end(), Print); cout << endl; //反转 reverse(v1.begin(), v1.end()); for_each(v1.begin(), v1.end(), Print);}int main(){ test01(); return 0;}常用拷贝和替换算法end//结束迭代器copy//容器内指定范围的元素拷贝到另一个容器中replace//将容器内指定范围的旧元素修改为新元素replace_if//容器内指定范围满足条件的元素替换为新元素swap//互换两个容器的元素copy拷贝copy(iterator beg, iterator end, iterator dest);//容器内指定范围的元素拷贝到另一个容器中beg//开始迭代器end//结束迭代器dest//目标容器的开始迭代器

用到的比较少,直接用赋值操作更简单

#include#include#includeusing namespace std;void Print(int val){    cout << val << " ";}void test01(){    vectorv1;    for (int i = 0; i < 10; i++)    {        v1.push_back(i);    }    vectorv2;    //v2要提前开辟空间    v2.resize(v1.size());    copy(v1.begin(), v1.end(), v2.begin());    for_each(v2.begin(), v2.end(), Print);}int main(){    test01();    return 0;}

replace替换

replace(iterator beg, iterator end, oldvalue, newvalue);//将区间内的旧元素替换为新元素

beg//起始迭代器#include#include#includeusing namespace std;class Print{public: void operator()(int val) { cout << val << " "; }};void test01(){ vectorv1; v1.push_back(1); v1.push_back(2); v1.push_back(1); v1.push_back(3); for_each(v1.begin(), v1.end(), Print()); cout << endl; //替换 replace(v1.begin(), v1.end(), 1, 2); for_each(v1.begin(), v1.end(), Print());}int main(){ test01(); return 0;}replace_if条件替换replace_if(iterator beg, iterator end, _Pred, newvalue);//容器内指定范围满足条件的元素替换为新元素end//结束迭代器oldvalue//旧元素newvalue//新元素beg//开始迭代器#include#include#includeusing namespace std;class Print{public: void operator()(int val) { cout << val << " "; }};class GreaterFive{public: bool operator()(const int& val) { return val > 5; }};void test01(){ vectorv; for (int i = 0; i < 10; i++) { v.push_back(i); } replace_if(v.begin(), v.end(), GreaterFive(), 0); for_each(v.begin(), v.end(), Print());}int main(){ test01(); return 0;}swap互换swap(container c1, container c2);//互换两个容器的元素end//结束迭代器_Pred//谓词newvalue//替换的新元素c1容器1c2容器2

注意必须是同种容器

#include#include#includeusing namespace std;class Print{public:    void operator()(int val)    {        cout << val << " ";    }};class GreaterFive{public:    bool operator()(const int& val)    {        return val > 5;    }};void test01(){    vectorv1;    vectorv2;    for (int i = 0; i < 10; i++)    {        v1.push_back(i);        v2.push_back(i + 2);    }    //交换前    for_each(v1.begin(), v1.end(), Print());    for_each(v2.begin(), v2.end(), Print());    cout << endl;    //交换后    swap(v1, v2);    for_each(v1.begin(), v1.end(), Print());    for_each(v2.begin(), v2.end(), Print());}int main(){    test01();    return 0;}

常用算术生成算法

算术生成算法属于小型算法,使用时包含的头文件为

accumulate//计算容器元素累计总和fill//向容器中添加元素accumulate累积accumulate(iterator beg, iterator end, value);//计算容器元素累计总和beg//起始迭代器#include#include#includeusing namespace std;void test01(){ vectorv1; for (int i = 0; i < 10; i++) { v1.push_back(i); } int total = accumulate(v1.begin(), v1.end(), 0); cout << total << endl;}int main(){ test01(); return 0;}fill填充fill(iterator beg, iterator end, value);//向容器中添加元素end//结束迭代器value//起始值beg//起始迭代器#include#include#includeusing namespace std;void test01(){ vectorv1; for (int i = 0; i < 10; i++) { v1.push_back(i); } for (vector::iterator it = v1.begin(); it != v1.end(); it++) { cout << *it << " "; } cout << endl; fill(v1.begin(), v1.end(), 0); for (vector::iterator it = v1.begin(); it != v1.end(); it++) { cout << *it << " "; }}int main(){ test01(); return 0;}常用集合容器end//结束迭代器value//填充的值set_intersection//求两个容器的交集set_union//求两个容器的并集set_difference//求两个容器的差集set_intersection求交集set_intersection(iterator beg1, iterator end1, iterator beg2, iterator end2, iterator dest);//求两个容器的交集beg1//容器1开始迭代器end1//容器1结束迭代器beg2//容器2开始迭代器end2//容器2结束迭代器dest//目标容器开始迭代器

注意事项:

返回值为迭代器,指向交集最后一个元素的下一个位置求交集的两个集合必须为有序数列目标容器开辟空间需要从两个容器中取小值

交集就是两个容器重复的元素

#include#include#include#includeusing namespace std;void myPrint(int val){    cout << val << " ";}void test01(){    vectorv1;    vectorv2;    for (int i = 0; i < 10; i++)    {        v1.push_back(i);        v2.push_back(i + 2);    }    for_each(v1.begin(), v1.end(), myPrint);    cout << endl;    for_each(v2.begin(), v2.end(), myPrint);    cout << endl;    //目标容器需要提前开辟空间,最特殊的情况,大容器包含小容器    vectorv3;    v3.resize(min(v1.size(), v2.size()));    //取交集    vector::iterator itEnd = set_intersection(v1.begin(), v1.end(), v2.begin(), v2.end(), v3.begin());    for_each(v3.begin(), itEnd, myPrint);    cout << endl;    //如果不用返回的itEnd,会把0也给打印出来    for_each(v3.begin(), v3.end(), myPrint);}int main(){    test01();    return 0;}

set_union求并集

set_union(iterator beg1, iterator end1, iterator beg2, iterator end2, iterator dest);//求两个容器的并集

beg1//容器1开始迭代器end1//容器1结束迭代器beg2//容器2开始迭代器end2//容器2结束迭代器dest//目标容器开始迭代器

注意事项:

返回值为迭代器,指向并集最后一个元素的下一个位置#include#include#include#includeusing namespace std;void myPrint(int val){ cout << val << " ";}void test01(){ vectorv1; vectorv2; for (int i = 0; i < 10; i++) { v1.push_back(i); v2.push_back(i + 2); } for_each(v1.begin(), v1.end(), myPrint); cout << endl; for_each(v2.begin(), v2.end(), myPrint); cout << endl; //目标容器需要提前开辟空间,最特殊的情况,两个容器没有交集 vectorv3; v3.resize(v1.size() + v2.size()); //取并集 vector::iterator itEnd = set_union(v1.begin(), v1.end(), v2.begin(), v2.end(), v3.begin()); for_each(v3.begin(), itEnd, myPrint); cout << endl; //如果不用返回的itEnd,会把0也给打印出来 for_each(v3.begin(), v3.end(), myPrint);}int main(){ test01(); return 0;}set_difference求差集set_difference(iterator beg1, iterator end1, iterator beg2, iterator end2, iterator dest);//求两个容器的差集求并集的两个集合必须为有序数列目标容器开辟空间需要两个容器相加beg1//容器1开始迭代器end1//容器1结束迭代器beg2//容器2开始迭代器end2//容器2结束迭代器dest//目标容器开始迭代器

注意事项:

返回值为迭代器,指向并集最后一个元素的下一个位置#include#include#include#includeusing namespace std;void myPrint(int val){ cout << val << " ";}void test01(){ vectorv1; vectorv2; for (int i = 0; i < 10; i++) { v1.push_back(i); v2.push_back(i + 2); } for_each(v1.begin(), v1.end(), myPrint); cout << endl; for_each(v2.begin(), v2.end(), myPrint); cout << endl; //目标容器需要提前开辟空间,最特殊的情况,大容器和小容器没有交集 //取两个容器中大的size作为目标容器开辟空间 vectorv3; v3.resize(max(v1.size(),v2.size())); //取并集 vector::iterator itEnd = set_difference(v1.begin(), v1.end(), v2.begin(), v2.end(), v3.begin()); for_each(v3.begin(), itEnd, myPrint); cout << endl; //如果不用返回的itEnd,会把0也给打印出来 for_each(v3.begin(), v3.end(), myPrint);}int main(){ test01(); return 0;}求并集的两个集合必须为有序数列目标容器开辟空间需要从两个容器中取大值

关键词: Java 编程算法

每日头条!STL-常用算法总结

transform(iteratorbeg1,iteratorend1,iteratorbeg2,_func); 搬运容器2023-02-13

克罗斯:最近我和莫德里奇不在场上的时候,我们看到了不同的足球

克罗斯:最近我和莫德里奇不在场上的时候,我们看到了不同的足球,巴西足球,皇家马德里,英格兰足球,托尼·克罗斯,国际足球赛事,卢卡·莫德里奇2023-02-13

资讯推荐:管理:任务、责任、实践_关于管理:任务、责任、实践介绍

1、《管理:任务、责任、实践》(Management:Tasks,Responsibilities,Practice2023-02-13

兰州新区“绿金通”入选2022年营商环境创新发展典型|焦点热文

在中国发展改革报社日前举行的2022年营商环境创新发展典型案例宣传活动中,新区“绿金通”平台案例从1443个案例中脱颖而出,成功入选2022年营2023-02-13

厦门为科创企业举办专题讲座 帮助企业优化组织内部管理结构_全球信息

科创企业迎来大展宏图的时代,但同时也面对着不确定性和挑战,亟须夯实基础,练好内功。2月10日下午,我市为科创企业举办《科创企业CEO的九宫2023-02-13

开学第一天,“五兔”送祝福

北京日报客户端|记者孙乐琪开学第一天,清晨7时10分,在翠微小学校门口,孩子们已经有序排着队等待入校了。每名学生都收到了学校专门为他们准2023-02-13

消息!女生送女生生日礼物送什么好

送女生的生日礼物,其实很多的,如果是女生,送女孩生日礼物可不可不可缺,最好选择女生喜欢的生日礼物就好啦,这样她也会记得你2023-02-13

新型环保材料有哪些_什么是新型装饰材料-环球速看

欢迎观看本篇文章,小升来为大家解答以上问题。新型环保材料有哪些,什么是新型装饰材料很多人还不知道,现在让我们一起来看看吧2023-02-13

合分比定理全部公式_合分比定理_世界微头条

1、一个比例里,第一个前后项之和与它们的差的比,等于第二个比的前后项的和与它们的差的比。2、这叫做比例中的合分比定理。32023-02-12

简讯:一直都爱着你日语_一直都爱着你

1、《一直爱着你》是一首由高安舒心合唱,高安作词,好记唱片作曲,冯丹编曲的歌曲。2、原歌词:女:熟悉的旋律再次响起;诗和画都是给你的;2023-02-12

全球微资讯!过节送老婆什么礼物

过几天就是老婆的生日了,我跟老婆结婚有三个多年,平时工作忙也没有时间回去看望老婆,今年想在过节给她个惊喜!大家帮忙推荐一2023-02-12

网易邮箱登录太频繁_网易邮箱登录126

1、第一个方法第一步,打开网易主页,因为126邮箱的服务商是网易,点击右上角第一行中的“免费邮箱”,进入邮箱页面。2、第2023-02-12

焦点观察:美食大战老鼠图鉴在哪里_美食大战老鼠图鉴

1、攻击卡:水管,三线,火盆。2、樱桃反弹,煮蛋器,(章鱼)辅助卡:小火。3、酒杯,大火炉更加辅助卡:木盘子,瓜皮。4、2023-02-11

首款豪华mpv腾势d9正式上市,采用了环抱式的设计-天天短讯

8月23日晚,腾势汽车推出的首款豪华MPV—腾势D9正式上市。新车定位中大型豪华MPV,一共推出七款车型,售价区间为32 98-45 98万元,其中纯电提供3款2023-02-11

当前动态:贺宛男:年报季开局 今年有点不一样

贺宛男:年报季开局今年有点不一样本文共1654字阅读完约4分钟■贺宛男年报年年有,今年年报开局却颇为奇特。2月8日晚间,金三江(3012023-02-11

全球新动态:【时讯】贵州剑河:重点项目工程建设正酣

【时讯】贵州剑河:重点项目工程建设正酣2023-02-11

天天动态:C罗上演大四喜 助利雅得胜利获胜

本文转自:羊城晚报C罗上演大四喜助利雅得胜利获胜C罗(右)在比赛中图 视觉中国2月10日在沙特联赛第16轮比赛中,38岁的超级巨星C罗上演大四喜2023-02-11

游戏“逆风”而行:过半公司业绩预亏|全球微动态

在过去的2022年,游戏公司业绩表现分化明显。从已披露的业绩预告来看,过半公司亏损,其中一大部分系由盈转亏。《中国经营报》记者梳理发现,2023-02-11

什么是登革热呢 登革热有什么症状呢

大家在生活中应该都听说过登革热吧,但是你了解登革热吗?今天小编就和大家一起来了解一下吧,究竟什么是登革热呢,以及登革热有什么症状呢?2023-02-11

买礼品盒深圳

买礼品盒深圳,买礼品盒是一种很多的地方,礼品盒的包装盒的有很多,礼品盒包装盒的盒的有很多,纸盒的盒子还有各类:。另外,礼2023-02-11

戴尔家用笔记本哪个系列性价比高_戴尔家用笔记本_天天滚动

1、戴尔14r系列,戴尔经典系列!比如灵越14R锋型版,刚刚出来的经典之作,这款玩绝大多数游戏都很流畅,外观都差不多,处理器内存硬盘显卡等主2023-02-11

tfboys是几线男团_时代少年团是几线男团|每日短讯

1、截止到2021年8月31日,tnt是2线男团。2、时代少年团(TeensinTimes、TNT)是由时代峰峻推出2023-02-10

A6软文联盟教你如何在网站设计中做好锚文本设置

现在无论是发软文还是外链贴吧,都想留锚文本,做高质外链。但是,能带锚文本的时候,你知道怎样去设置吗? 网站的链接做得好,有利于提高网2023-02-10

天天观速讯丨我的世界中国版账号密码大全下载_我的世界中国版账号密码大全

1、账号和密码是由用户自己注册的邮箱或手机号,密码为用户自己所设定。2、登陆游戏所用的就是网易通行证的账号与密码。本文分2023-02-10

男性早泄的调理方法_男性早泄的调理方法|世界今头条

男性早泄是临床上非常常见的问题,严重影响性生活质量。早泄的原因有很多。男性早泄应根据病因进行治疗。早泄的常见原因如下:12023-02-10