• C++常用标准算法


    算法主要由头文件组成。
    是所有STL头文件中最大的一个,范围涉及到比较、交换、查找、遍历、赋值、修改等等;体积很小,只包括几个在序列上面进行简单数学运算的模板函数;定义了一些模板类。

    一.遍历

    1.std::for_each

    std::for_each用于遍历容器

    1. #include
    2. #include
    3. #include
    4. void print1(const int &val)
    5. {
    6.     std::cout << val << " ";
    7. }
    8. class print2
    9. {
    10. public:
    11.     void operator()(const int &val)
    12.     {
    13.         std::cout << val << " ";
    14.     }
    15. };
    16. void test1()
    17. {
    18.     std::vector<int> v;
    19.     for (int i = 0; i < 10; i++)
    20.     {
    21.         v.push_back(i);
    22.     }
    23.     for_each(v.begin(), v.end(), print1);
    24.     std::cout << std::endl;
    25.     for_each(v.begin(), v.end(), print2());
    26. }
    27. int main()
    28. {
    29.     test1();
    30.     return 0;
    31. }


    2.std::transform

    std::transform用于搬运容器到另一个容器中

    1. #include
    2. #include
    3. #include
    4. void printVector(const int &val)
    5. {
    6.     std::cout << val << " ";
    7. }
    8. class Transform
    9. {
    10. public:
    11.     int operator()(int v)
    12.     {
    13.         return v + 3;
    14.     }
    15. };
    16. void test1()
    17. {
    18.     std::vector<int> v1;
    19.     for (int i = 0; i < 10; i++)
    20.     {
    21.         v1.push_back(i);
    22.     }
    23.     std::vector<int> v2;
    24.     v2.resize(v1.size());
    25.     transform(v1.begin(), v1.end(), v2.begin(), Transform());
    26.     for_each(v1.begin(), v1.end(), printVector);
    27.     std::cout << std::endl;
    28.     for_each(v2.begin(), v2.end(), printVector);
    29.     std::cout << std::endl;
    30. }
    31. int main()
    32. {
    33.     test1();
    34.     return 0;
    35. }

    二.查找

    1.std::find

    std::find用于查找指定元素,找到返回指定元素的迭代器,找不到返回结束迭代器end()

    1. #include
    2. #include
    3. #include
    4. void test1()
    5. {
    6.     std::vector<int> v1;
    7.     for (int i = 0; i < 10; i++)
    8.     {
    9.         v1.push_back(i);
    10.     }
    11.     std::vector<int>::iterator it = std::find(v1.begin(), v1.end(), 5);
    12.     if (it == v1.end())
    13.     {
    14.         std::cout << "Find failed!" << std::endl;
    15.     }
    16.     else
    17.     {
    18.         std::cout << "Find succeed: " << *it << std::endl;
    19.     }
    20. }
    21. int main()
    22. {
    23.     test1();
    24.     return 0;
    25. }

    2.std::find_if

    std::find_if用于按条件查找

    1. #include
    2. #include
    3. #include
    4. class GreaterFive
    5. {
    6. public:
    7.     bool operator()(int val)
    8.     {
    9.         return val > 5;
    10.     }
    11. };
    12. void test1()
    13. {
    14.     std::vector<int> v1;
    15.     for (int i = 0; i < 10; i++)
    16.     {
    17.         v1.push_back(i);
    18.     }
    19.     std::vector<int>::iterator it = find_if(v1.begin(), v1.end(), GreaterFive());
    20.     if (it == v1.end())
    21.     {
    22.         std::cout << "Find failed" << std::endl;
    23.     }
    24.     else
    25.     {
    26.         std::cout << "Find numbers greater than 5: " << *it << std::endl;
    27.     }
    28. }
    29. int main()
    30. {
    31.     test1();
    32.     return 0;
    33. }


    3.std::adjacent_find

    std::adjacent_find用于查找相邻重复元素,返回相邻元素的第一个位置的迭代器

    1. #include
    2. #include
    3. #include
    4. void test1()
    5. {
    6.     std::vector<int> v1;
    7.     v1.push_back(1);
    8.     v1.push_back(2);
    9.     v1.push_back(2);
    10.     std::vector<int>::iterator it = adjacent_find(v1.begin(), v1.end());
    11.     if (it == v1.end())
    12.     {
    13.         std::cout << "Find failed" << std::endl;
    14.     }
    15.     else
    16.     {
    17.         std::cout << "Find adjacent numbers: " << *it << std::endl;
    18.     }
    19. }
    20. int main()
    21. {
    22.     test1();
    23.     return 0;
    24. }

    4.std::binary_search

    std::binary_search(二分查找)用于查找指定元素是否存在。查到返回true,否则false。需要注意的是该算法在无序序列中不可用

    1. #include
    2. #include
    3. #include
    4. void test1()
    5. {
    6.     std::vector<int> v1;
    7.     for (int i = 0; i < 10; i++)
    8.     {
    9.         v1.push_back(i);
    10.     }
    11.     bool ret = std::binary_search(v1.begin(), v1.end(), 9);
    12.     if (ret)
    13.     {
    14.         std::cout << "Find succeed" << std::endl;
    15.     }
    16.     else
    17.     {
    18.         std::cout << "Find failed" << std::endl;
    19.     }
    20. }
    21. int main()
    22. {
    23.     test1();
    24.     return 0;
    25. }

    三.统计元素个数

    1.std::count

    std::count用于统计元素出现的次数
     

    1. #include
    2. #include
    3. #include
    4. void test1()
    5. {
    6.     std::vector<int> v1;
    7.     v1.push_back(1);
    8.     v1.push_back(2);
    9.     v1.push_back(2);
    10.     int num = std::count(v1.begin(), v1.end(), 2);
    11.     std::cout << "The count of 2: " << num<< std::endl;
    12. }
    13. int main()
    14. {
    15.     test1();
    16.     return 0;
    17. }

    2.std::count_if

    std::count_if用于按条件统计元素个数

    1. #include
    2. #include
    3. #include
    4. class CountIf
    5. {
    6. public:
    7.     bool operator()(int val)
    8.     {
    9.         return val > 5;
    10.     }
    11. };
    12. void test1()
    13. {
    14.     std::vector<int> v1;
    15.     for (int i = 0; i < 10; i++)
    16.     {
    17.         v1.push_back(i);
    18.     }
    19.     int num = std::count_if(v1.begin(), v1.end(), CountIf());
    20.     std::cout << "The count of numbers greater than 5: " << num << std::endl;
    21. }
    22. int main()
    23. {
    24.     test1();
    25.     return 0;
    26. }

    四.排序

    1.std::sort

    std::sort用于进行升序或降序

    1. #include
    2. #include
    3. #include
    4. void printVector(int val)
    5. {
    6.     std::cout << val << " ";
    7. }
    8. void test1()
    9. {
    10.     std::vector<int> v1;
    11.     v1.push_back(2);
    12.     v1.push_back(1);
    13.     v1.push_back(3);
    14.     // 默认升序
    15.     std::sort(v1.begin(), v1.end());
    16.     std::for_each(v1.begin(), v1.end(), printVector);
    17.     std::cout << std::endl;
    18.     // 降序
    19.     std::sort(v1.begin(), v1.end(), std::greater<int>());
    20.     std::for_each(v1.begin(), v1.end(), printVector);
    21.     std::cout << std::endl;
    22. }
    23. int main()
    24. {
    25.     test1();
    26.     return 0;
    27. }

    2.std::random_shuffle

    std::random_shuffle用于洗牌,指定范围内的元素随机调整次序

    1. #include
    2. #include
    3. #include
    4. #include
    5. void printVector(int val)
    6. {
    7.     std::cout << val << " ";
    8. }
    9. void test1()
    10. {
    11.     std::vector<int> v1;
    12.     for (int i = 0; i < 10; i++)
    13.     {
    14.         v1.push_back(i);
    15.     }
    16.     std::srand((unsigned int)time(nullptr));
    17.     std::random_shuffle(v1.begin(), v1.end());
    18.     std::for_each(v1.begin(), v1.end(), printVector);
    19.     std::cout << std::endl;
    20. }
    21. int main()
    22. {
    23.     test1();
    24.     return 0;
    25. }


    3.std::merge

    std::merge用于将两个容器元素合并,并存储到另一个容器中。合并后,目标容器仍然是有序的

    1. #include
    2. #include
    3. #include
    4. void printVector(int val)
    5. {
    6.     std::cout << val << " ";
    7. }
    8. void test1()
    9. {
    10.     std::vector<int> v1;
    11.     std::vector<int> v2;
    12.     for (int i = 0; i < 10; i++)
    13.     {
    14.         v1.push_back(i);
    15.         v2.push_back(i + 1);
    16.     }
    17.     std::vector<int> v3;
    18.     v3.resize(v1.size() + v2.size());
    19.     std::merge(v1.begin(), v1.end(), v2.begin(), v2.end(), v3.begin());
    20.     std::for_each(v3.begin(), v3.end(), printVector);
    21.     std::cout << std::endl;
    22. }
    23. int main()
    24. {
    25.     test1();
    26.     return 0;
    27. }


    4.std::reverse

    std::reverse用于将容器内元素进行反转

    1. #include
    2. #include
    3. #include
    4. void printVector(int val)
    5. {
    6.     std::cout << val << " ";
    7. }
    8. void test1()
    9. {
    10.     std::vector<int> v1;
    11.     for (int i = 0; i < 10; i++)
    12.     {
    13.         v1.push_back(i);
    14.     }
    15.     std::cout << "Before: ";
    16.     std::for_each(v1.begin(), v1.end(), printVector);
    17.     std::cout << std::endl;
    18.     std::cout << "After:  ";
    19.     std::reverse(v1.begin(), v1.end());
    20.     std::for_each(v1.begin(), v1.end(), printVector);
    21.     std::cout << std::endl;
    22. }
    23. int main()
    24. {
    25.     test1();
    26.     return 0;
    27. }


    五.拷贝和替换

    1.std::copy

    std::copy用于将容器内指定范围的元素拷贝到另一容器中。使用v2 = v1效果一样,记得提前给容器分配空间

    1. #include
    2. #include
    3. #include
    4. void printVector(int val)
    5. {
    6.     std::cout << val << " ";
    7. }
    8. void test1()
    9. {
    10.     std::vector<int> v1;
    11.     for (int i = 0; i < 10; i++)
    12.     {
    13.         v1.push_back(i);
    14.     }
    15.     std::vector<int> v2;
    16.     v2.resize(v1.size());
    17.     std::copy(v1.begin(), v1.end(), v2.begin());
    18.     std::for_each(v2.begin(), v2.end(), printVector);
    19.     std::cout << std::endl;
    20. }
    21. int main()
    22. {
    23.     test1();
    24.     return 0;
    25. }


    2.std::replace

    std::replace用于将容器内指定范围的旧元素修改为新元素

    1. #include
    2. #include
    3. #include
    4. void printVector(int val)
    5. {
    6.     std::cout << val << " ";
    7. }
    8. void test1()
    9. {
    10.     std::vector<int> v1;
    11.     for (int i = 0; i < 10; i++)
    12.     {
    13.         v1.push_back(i);
    14.     }
    15.     std::cout << "Before: ";
    16.     std::for_each(v1.begin(), v1.end(), printVector);
    17.     std::cout << std::endl;
    18.     std::cout << "After:  ";
    19.     std::replace(v1.begin(), v1.end(), 0, 1);
    20.     std::for_each(v1.begin(), v1.end(), printVector);
    21.     std::cout << std::endl;
    22. }
    23. int main()
    24. {
    25.     test1();
    26.     return 0;
    27. }


    3.std::replace_if

    std::replace_if用于将容器内指定范围满足条件的元素替换为新元素。可以利用仿函数灵活筛选满足的条件

    1. #include
    2. #include
    3. #include
    4. void printVector(int val)
    5. {
    6.     std::cout << val << " ";
    7. }
    8. class Rule
    9. {
    10. public:
    11.     bool operator()(int val)
    12.     {
    13.         return val > 5;
    14.     }
    15. };
    16. void test1()
    17. {
    18.     std::vector<int> v1;
    19.     for (int i = 0; i < 10; i++)
    20.     {
    21.         v1.push_back(i);
    22.     }
    23.     std::cout << "Before: ";
    24.     std::for_each(v1.begin(), v1.end(), printVector);
    25.     std::cout << std::endl;
    26.     std::cout << "After:  ";
    27.     // 把容器中所有大于5的元素,替换为6
    28.     std::replace_if(v1.begin(), v1.end(), Rule(), 6);
    29.     std::for_each(v1.begin(), v1.end(), printVector);
    30.     std::cout << std::endl;
    31. }
    32. int main()
    33. {
    34.     test1();
    35.     return 0;
    36. }


    4.std::swap

    std::swap用于互换两个容器的元素。无需重新指定容器的大小

    1. #include
    2. #include
    3. #include
    4. void printVector(int val)
    5. {
    6.     std::cout << val << " ";
    7. }
    8. void test1()
    9. {
    10.     std::vector<int> v1;
    11.     for (int i = 0; i < 10; i++)
    12.     {
    13.         v1.push_back(i);
    14.     }
    15.     std::vector<int> v2;
    16.     for (int i = 0; i < 5; i++)
    17.     {
    18.         v2.push_back(i);
    19.     }
    20.     // 交换两个容器内的元素,无需重新指定容器大小
    21.     std::swap(v1, v2);
    22.     std::for_each(v1.begin(), v1.end(), printVector);
    23.     std::cout << std::endl;
    24.     std::for_each(v2.begin(), v2.end(), printVector);
    25.     std::cout << std::endl;
    26. }
    27. int main()
    28. {
    29.     test1();
    30.     return 0;
    31. }


    六.算术生成

    1.std::accumulate

    std::accumulate用于计算容器内元素累计总和

    1. #include
    2. #include
    3. #include
    4. void test1()
    5. {
    6.     std::vector<int> v1;
    7.     for (int i = 0; i < 3; i++)
    8.     {
    9.         v1.push_back(i);
    10.     }
    11.     // 最后一个参数是累加的初值,accumulate将它的一个内部变量设置为指定的初值,
    12.     // 然后在此初值上累加输入范围内所有元素的值.1+0+1+2=4
    13.     int total = std::accumulate(v1.begin(), v1.end(), 1);
    14.     std::cout << total;
    15. }
    16. int main()
    17. {
    18.     test1();
    19.     return 0;
    20. }


    2.std::fill

    std::fill用于向容器中添加元素

    1. #include
    2. #include
    3. #include
    4. #include
    5. void printVector(int val)
    6. {
    7.     std::cout << val << " ";
    8. }
    9. void test1()
    10. {
    11.     std::vector<int> v1;
    12.     v1.resize(10);
    13.     std::fill(v1.begin(), v1.end(), 1);
    14.     std::for_each(v1.begin(), v1.end(), printVector);
    15.     std::cout << std::endl;
    16. }
    17. int main()
    18. {
    19.     test1();
    20.     return 0;
    21. }


    七.集合

    1.std::set_intersection

    std::set_intersection用于求两个容器的交集。两个容器必须是有序序列,可以先用排序算法转化为有序序列,再求交集。目标容器开启空间需要从两个容器中取小值。返回值是交集中最后一个元素的位置

    1. #include
    2. #include
    3. #include
    4. void printVector(int val)
    5. {
    6.     std::cout << val << " ";
    7. }
    8. void test1()
    9. {
    10.     std::vector<int> v1;
    11.     for (int i = 0; i < 10; i++)
    12.     {
    13.         v1.push_back(i);
    14.     }
    15.     std::vector<int> v2;
    16.     for (int i = 0; i < 5; i++)
    17.     {
    18.         v2.push_back(i);
    19.     }
    20.     std::vector<int> v3;
    21.     v3.resize(std::min(v1.size(), v2.size()));
    22.     std::set_intersection(v1.begin(), v1.end(), v2.begin(), v2.end(), v3.begin());
    23.     std::for_each(v3.begin(), v3.end(), printVector);
    24.     std::cout << std::endl;
    25. }
    26. int main()
    27. {
    28.     test1();
    29.     return 0;
    30. }

    2.std::set_union

    std::set_union用于求两个容器的并集。两个容器必须是有序序列。目标容器开辟空间的大小为两个容器相加。返回值是并集中最后一个元素的位置

    1. #include
    2. #include
    3. #include
    4. void printVector(int val)
    5. {
    6.     std::cout << val << " ";
    7. }
    8. void test1()
    9. {
    10.     std::vector<int> v1;
    11.     for (int i = 0; i < 10; i++)
    12.     {
    13.         v1.push_back(i);
    14.     }
    15.     std::vector<int> v2;
    16.     for (int i = 0; i < 5; i++)
    17.     {
    18.         v2.push_back(i);
    19.     }
    20.     std::vector<int> v3;
    21.     v3.resize(v1.size() + v2.size());
    22.      
    23.     std::vector<int>::iterator itEnd = std::set_union(v1.begin(), v1.end(), v2.begin(), v2.end(), v3.begin());
    24.     // 注意这里要判断itEnd,如果换成v3.end(),会输出v3后面的5个0
    25.     std::for_each(v3.begin(), itEnd, printVector);
    26.     std::cout << std::endl;
    27. }
    28. int main()
    29. {
    30.     test1();
    31.     return 0;
    32. }


    3.std::set_difference

    std::set_difference用于求两个容器的差集。注意是v1-v2还是v2-v1。两个容器为有序序列。目标容器开辟空间为两个容器中的较大值。返回值是差集中最后一个元素的位置

    1. #include
    2. #include
    3. #include
    4. void printVector(int val)
    5. {
    6.     std::cout << val << " ";
    7. }
    8. void test1()
    9. {
    10.     std::vector<int> v1;
    11.     for (int i = 0; i < 10; i++)
    12.     {
    13.         v1.push_back(i);
    14.     }
    15.     std::vector<int> v2;
    16.     for (int i = 0; i < 5; i++)
    17.     {
    18.         v2.push_back(i);
    19.     }
    20.     std::vector<int> v3; // 目标容器,需要提前开辟空间
    21.     v3.resize(std::max(v1.size(), v2.size()));
    22.     std::cout << "v1-v2: ";
    23.     std::vector<int>::iterator itEnd1 = std::set_difference(v1.begin(), v1.end(), v2.begin(), v2.end(), v3.begin());
    24.     std::for_each(v3.begin(), itEnd1, printVector);
    25.     std::cout << std::endl;
    26.     std::cout << "v2-v1: ";
    27.     std::vector<int>::iterator itEnd2 = std::set_difference(v2.begin(), v2.end(), v1.begin(), v1.end(), v3.begin());
    28.     // 输出为空,因为v2-v1,v2中没有v1的元素
    29.     std::for_each(v3.begin(), itEnd2, printVector);
    30.     std::cout << std::endl;
    31. }
    32. int main()
    33. {
    34.     test1();
    35.     return 0;
    36. }


    八.去重

    std::unique,详见:C++之std::vector元素去重

    原文链接:C++常用标准算法-CSDN博客

  • 相关阅读:
    概率论_复习_第6章:数理统计的基本概念
    RabbitMQ中的核心概念和交换机类型
    MySQL缓冲池Buffer Pool
    LNMP动态网站
    【洛谷 P1115】最大子段和 题解(贪心算法)
    【学习笔记21】JavaScript数组的基本方法
    ARM系统控制和管理接口System Control and Management Interface
    【数据结构与算法分析】0基础带你学数据结构与算法分析09--线索二叉树 (TBT)
    使用EasyExcel 导入数据,失败原因数据导出
    Visual Studio v1.67改进了深色主题
  • 原文地址:https://blog.csdn.net/caoshangpa/article/details/134020235