• 【C++编程语言】STL常用算法 算术生成和集合算法


     

    1.算术生成算法概念

    算法简介

    • accumlate 计算容器元素累计总和
    • fill 向容器中添加元素

    注意算术生成算法属于小型算法 使用时包含头文件为#include

    2.accumulate

    1. /*
    2. 函数原型:
    3. int accumulate(iterator beg ,iterator end , value);
    4. 计算容器元素累加总和
    5. beg 开始迭代器
    6. end 结束迭代器
    7. value 起始值
    8. */
    9. void test01() {
    10. vector<int> v;
    11. for (int i = 0; i <= 100; i++) {
    12. v.push_back(i);
    13. }
    14. //参数3 起始累加值
    15. int total = accumulate(v.begin(), v.end(), 0);
    16. cout<< total <<endl;
    17. }
    18. int main() {
    19. test01();
    20. system("pause");
    21. return 0;
    22. }

    3.fill 向容器中填充指定的元素

    1. /*
    2. 函数原型:
    3. fill(iterator beg ,iterator end , value);
    4. 向容器中填充元素
    5. beg 开始迭代器
    6. end 结束迭代器
    7. value 填充值
    8. */
    9. void myPrint(int val) {
    10. cout<<val<<" ";
    11. }
    12. void test01() {
    13. vector<int> v;
    14. v.resize(10);
    15. //重新填充
    16. fill(v.begin(), v.end(), 100);
    17. for_each(v.begin(), v.end(), myPrint);
    18. }
    19. int main() {
    20. test01();
    21. system("pause");
    22. return 0;
    23. }

    4.集合算法概念

    算法简介

    • set_intersection 求两个容器的交集
    • set_union 求两个容器的并集
    • set_difference 求两个容器的差集

    5.set_intersection 求两个容器的交集

    1. /*
    2. 函数原型:
    3. iterator set_itersection(iterator beg1 ,iterator end1 , iterator beg2 ,iterator end2 ,iterator dest);
    4. 求两个集合的交集
    5. 注意:两个容器的必须是有序序列
    6. beg1 容器1开始迭代器
    7. end1 容器1结束迭代器
    8. beg2 容器2开始迭代器
    9. end2 容器2结束迭代器
    10. dest 目标容器开始迭代器
    11. 返回值为:目标容器的最后一个元素的迭代器地址
    12. */
    13. void myPrint(int val) {
    14. cout<<val<<" ";
    15. }
    16. void test01() {
    17. vector<int> v1;
    18. vector<int> v2;
    19. for (int i = 0; i < 10; i++) {
    20. v1.push_back(i);
    21. v2.push_back(i + 5);
    22. }
    23. //目标容器需要提前开辟空间
    24. //最特殊情况 大容器包含小容器 开辟空间 取小空间的size即可
    25. vector<int> vTarget;
    26. vTarget.resize(min(v1.size(),v2.size()));
    27. //获取交集
    28. //返回值是目标容器的最后一个元素的迭代器地址
    29. vector<int>::iterator itEnd = set_intersection(v1.begin(), v1.end(), v2.begin(), v2.end(), vTarget.begin());
    30. for_each(vTarget.begin(), itEnd, myPrint);
    31. }
    32. int main() {
    33. test01();
    34. system("pause");
    35. return 0;
    36. }

    6.set_union 求两个集合的并集

    1. /*
    2. 函数原型:
    3. iterator set_union(iterator beg1 ,iterator end1 , iterator beg2 ,iterator end2 ,iterator dest);
    4. 求两个集合的交集
    5. 注意:两个容器的必须是有序序列
    6. beg1 容器1开始迭代器
    7. end1 容器1结束迭代器
    8. beg2 容器2开始迭代器
    9. end2 容器2结束迭代器
    10. dest 目标容器开始迭代器
    11. 返回值为:目标容器的最后一个元素的迭代器地址
    12. */
    13. void myPrint(int val) {
    14. cout<<val<<" ";
    15. }
    16. void test01() {
    17. vector<int> v1;
    18. vector<int> v2;
    19. for (int i = 0; i < 10; i++) {
    20. v1.push_back(i);
    21. v2.push_back(i + 5);
    22. }
    23. //目标容器需要提前开辟空间
    24. vector<int> vTarget;
    25. vTarget.resize(v1.size()+v2.size());
    26. //获取并集
    27. //返回值是目标容器的最后一个元素的迭代器地址
    28. vector<int>::iterator itEnd = set_union(v1.begin(), v1.end(), v2.begin(), v2.end(), vTarget.begin());
    29. for_each(vTarget.begin(), itEnd, myPrint);
    30. }
    31. int main() {
    32. test01();
    33. system("pause");
    34. return 0;
    35. }

    7.set_difference 求两个集合的差集

    1. /*
    2. 函数原型:
    3. iterator set_difference(iterator beg1 ,iterator end1 , iterator beg2 ,iterator end2 ,iterator dest);
    4. 求两个集合的差集
    5. 注意:两个容器的必须是有序序列
    6. beg1 容器1开始迭代器
    7. end1 容器1结束迭代器
    8. beg2 容器2开始迭代器
    9. end2 容器2结束迭代器
    10. dest 目标容器开始迭代器
    11. 返回值为:目标容器的最后一个元素的迭代器地址
    12. */
    13. void myPrint(int val) {
    14. cout<<val<<" ";
    15. }
    16. void test01() {
    17. vector<int> v1;
    18. vector<int> v2;
    19. for (int i = 0; i < 10; i++) {
    20. v1.push_back(i);
    21. v2.push_back(i + 5);
    22. }
    23. //目标容器需要提前开辟空间
    24. vector<int> vTarget;
    25. //最特殊情况 两个容器没有交集 取两个容器中大的那个
    26. vTarget.resize(max(v1.size(),v2.size()));
    27. //获取差集 注意v1和v2的差集 与 v2和v1的差集是不相同
    28. //返回值是目标容器的最后一个元素的迭代器地址
    29. vector<int>::iterator itEnd = set_difference(v1.begin(), v1.end(), v2.begin(), v2.end(), vTarget.begin());
    30. for_each(vTarget.begin(), itEnd, myPrint);
    31. }
    32. int main() {
    33. test01();
    34. system("pause");
    35. return 0;
    36. }

     

  • 相关阅读:
    [PAT练级笔记] 68 Basic Level 1068 万绿丛中一点红
    【日常踩坑】解决 kex_exchange_identification 报错
    数字化时代,企业为什么需要商业智能BI
    springboot水环境检测系统的设计与实现毕业设计源码041446
    Vue项目流程6,登录与注册,完成获取验证码,登录跳转,利用token获取用户信息,退出登录等功能,利用导航守卫在路由跳转之间进行判断
    Ubuntu 22.04(LinuxMint 21)编译wine7.19安装最新微信3.7.6及QQ体会
    Redis实战精讲(1)
    elementUI textarea可自适应文本高度的文本域
    Xilinx 7系列FPGA 高性能(HP)接口与2.5V/3.3V 外设IO接口设计考虑
    bugku 黄道十二官
  • 原文地址:https://blog.csdn.net/m0_69824302/article/details/133976880