当前位置: 首页 > news >正文

STL常用生成算法和集合算法(20221207)

STL的常用算法

概述:

算法主要是由头文件<algorithm> <functional> <numeric> 组成。

<algorithm>是所有STL头文件中最大的一个,涉及比较、交换、查找、遍历等等;

<functional>定义了一些模板类,用于声明函数对象;

<numeric>体积很小,只包括几个在序列上面进行简单数学运算的模板函数。

四、常用的算术生成算法

注意:算术生成算法属于小型算法,使用时包含的头文件为#include<numeric>

算法简介:

accumulate  //计算容器元素累计总和

fill   //向容器中添加元素

1、accumulate(iterator beg,iterator end,value);

value 起始值 ,起始的累加值,不需要的话设为0

即最终应该返回:value+区间内元素的总和

//常用算术生成算法

void test01()

{

    vector<int>V;

    for (int i = 0; i <= 100; i++)

    {

        V.push_back(i);

    }

    int sum = accumulate(V.begin(), V.end(), 0);//返回计算的总和

    int sum1 = accumulate(V.begin(), V.end(), 100);//返回元素的总和+100=5150

    cout << "元素总和:" << sum << endl;

    cout << "元素总和+100:" << sum1 << endl;

}

2、fill(iterator beg,iterator end,value);

将指定区间内的元素填充为指定的元素

void myPrint(int val)

{

    cout << val << " ";

}



//常用算术生成算法

void test02()

{

    vector<int>V;

    for (int i = 0; i <= 100; i++)

    {

        V.push_back(i);

    }

    fill(V.begin(), V.end(), 99);

    for_each(V.begin(), V.end(), myPrint);

    cout << endl;

}

五、常用的集合算法

set_intersection //求两个容器的交集

set_union //求两个容器的并集

set_difference //求两个容器的差集

1、set_intersection

set_intersection(v1.begin(), v1.end(), v2.begin(), v2.end(), vTarget1.begin())

返回一个结束位置的迭代器

注意两个原容器必须是有序序列。

void test01()

{

    vector<int>v1;

    vector<int>v2;

    for (int i = 0; i < 10; i++)

    {

        v1.push_back(i);

    }

    for (int i = 5; i < 18; i++)

    {

        v2.push_back(i);

    }

    //目标容器

    vector<int>vTarget1;

    //目标容器需要重新开辟空间

    //空间大小:最特殊情况为一个大容器中包含一个小容器,此时交集大小为小容器大小

    vTarget1.resize(min(v1.size(), v2.size()));

    //获取交集

    vector<int>::iterator itEnd =  set_intersection(v1.begin(), v1.end(), v2.begin(), v2.end(), vTarget1.begin());

    for_each(vTarget1.begin(), itEnd, myPrint); //结束时用返回的迭代器 若用vTarget.end() 会将容器末尾补0返回

    cout << endl;

    for_each(vTarget1.begin(), vTarget1.end(), myPrint); //结束时用返回的迭代器 若用vTarget.end() 会将容器末尾补0返回

    cout << endl;

}

2、set_union

vector<int>::iterator itEnd= set_union(v1.begin(), v1.end(), v2.begin(), v2.end(), vTarget1.begin());

void test02()

{

    vector<int>v1;

    vector<int>v2;

    for (int i = 0; i < 10; i++)

    {

        v1.push_back(i);

    }

    for (int i = 5; i < 18; i++)

    {

        v2.push_back(i);

    }

    //目标容器

    vector<int>vTarget1;

    //目标容器需要重新开辟空间

    //空间大小:最特殊情况为两个容器无重复元素,此时并集大小为两个集合之和

    vTarget1.resize(v1.size()+v2.size());

    //获取并集 结束时会返回并集的最后一个元素的迭代器

    vector<int>::iterator itEnd = set_union(v1.begin(), v1.end(), v2.begin(), v2.end(), vTarget1.begin());

    for_each(vTarget1.begin(), itEnd, myPrint); //结束时用返回的迭代器 若用vTarget.end() 会将容器末尾补0返回

    cout << endl;

    for_each(vTarget1.begin(), vTarget1.end(), myPrint); //结束时用返回的迭代器 若用vTarget.end() 会将容器末尾补0返回

    cout << endl;

}

3、set_difference //求两个容器的差集

注意两个容器的差集不同

void test03()

{

    vector<int>v1;

    vector<int>v2;

    for (int i = 0; i < 10; i++)

    {

        v1.push_back(i);

    }

    for (int i = 5; i < 18; i++)

    {

        v2.push_back(i);

    }

    //目标容器

    vector<int>vTarget1;

    //目标容器需要重新开辟空间

    //空间大小:最特殊情况为两个容器无重复元素,此时差集大小为两个容器尺寸中的最大值(也可能是小的 看对象是哪个容器)

    vTarget1.resize(max(v1.size(),v2.size()));

    //获取差集 结束时会返回并集的最后一个元素的迭代器

    vector<int>::iterator itEnd = set_difference(v1.begin(), v1.end(), v2.begin(), v2.end(), vTarget1.begin()); //v1相对于v2的差集

    cout << "v1相对于v2的差集" << endl;

    for_each(vTarget1.begin(), itEnd, myPrint); //结束时用返回的迭代器 若用vTarget.end() 会将容器末尾补0返回

    cout << endl;

    cout << "v2相对于v1的差集" << endl;

    itEnd = set_difference(v2.begin(), v2.end(), v1.begin(), v1.end(), vTarget1.begin());//v2相对于v1的差集

    for_each(vTarget1.begin(), itEnd, myPrint);

}

相关文章:

  • 基于遗传算法解决TSP问题(Matlab代码实现)
  • Python操作Excel表格
  • 2022年Python面试题汇总【面试官爱问】
  • 【Linux学习】进程概念(下)
  • 认知电子战 | 认知电子战简介
  • 5G无线技术基础自学系列 | NSA组网场景下移动性管理
  • 深度解读 | 如何构建以指标为核心的ABI平台?
  • 二本蒟蒻的带牌退役感言(感谢两年来的acm经历)
  • 深度学习Week9-YOLOv5-C3模块实现(Pytorch)
  • 【学生网页设计作品 】关于HTML公益主题网页设计——谨防电信诈骗网
  • 刷爆力扣之最短无序连续子数组
  • c++还原简单的vector
  • HTML学生个人网站作业设计 明星易烊千玺介绍(HTML+CSS) web前端开发技术 web课程设计 网页规划与设计
  • 从零学习VINS-Mono/Fusion源代码(五):VIO初始化
  • 正则表达式入门级别详细教程
  • Docker数据卷自定义Docker镜像
  • HTML网页设计结课作业——基于HTML+CSS仿学校官网页面
  • m基于遗传优化的不同等级电动汽车充电站的选址方案matlab仿真
  • 十三、泛型
  • 【C语言进阶(NEW)】一、数据储存详解|数据类型介绍|整形在内存中的存储|浮点型在内存中的存储
  • 中青旅:第一季度营业收入约20.54亿元,乌镇景区接待游客数量同比减少6.7%
  • 2025年“投资新余•上海行”钢铁产业“双招双引”推介会成功举行
  • 新华保险一季度净赚58.82亿增19%,保费收入增28%
  • 江西省公安厅警务保障部原主任辛卫平主动交代问题,正接受审查调查
  • 西夏文残碑等文物来沪,见证一段神秘灿烂的历史
  • 跟着京剧电影游运河,京杭大运河沿线六城举行京剧电影展映