• 【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. }

     

  • 相关阅读:
    别再用if-else了,分享一下我使用“策略模式”的项目经验...
    周记之马上要答辩了
    debian无法使用reboot 等系统命令解决
    spring高级50讲
    智能公交站牌远程通信系统解决方案,公车信息一目了然
    算法通关村第十一关青铜挑战——移位运算详解
    剑指offer!年薪300万P9大佬揭秘Spring全家桶手册,刷完入职字节
    嵌入式FreeRTOS学习六,FreeRTOS中CPU寄存器与RAM内存和Flash之间的数据传输,以及栈空间的作用
    UE5——网络——RPC
    java进出口食品安全信息管理系统计算机毕业设计MyBatis+系统+LW文档+源码+调试部署
  • 原文地址:https://blog.csdn.net/m0_69824302/article/details/133976880