• C++学习笔记(三十)


    在完成对C语言的学习后,我最近开始了对C++和Java的学习,目前跟着视频学习了一些语法,也跟着敲了一些代码,有了一定的掌握程度。现在将跟着视频做的笔记进行整理。本篇博客是整理C++知识点的第三十篇博客。

    本篇博客介绍了C++的常用遍历算法和常用查找算法。

    本系列博客所有C++代码都在Visual Studio 2022环境下编译运行。程序为64位。

    目录

    常用遍历算法

    for_each

    transform

    常用查找算法

    find

    find_if

    abjacent_find

    binary_search

    count

    count_if


    常用遍历算法

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

    algorithm是所有STL头文件中最大的一个,涉及比较、交换、查找、遍历操作、复制、修改等。

    numeric内容比较少,只包括几个在序列上面进行简单数学运算的模板函数。

    functional定义一些模板类,用于声明函数对象。

    使用遍历算法需要包含algortihm

    for_each

    for_each实现遍历容器。函数原型是:

    for_each(iterator beg,iterator end,func)

    用于遍历容器元素,beg表示开始,end表示结束,func是函数或函数对象。

    1. #include
    2. #include
    3. #include
    4. using namespace std;
    5. void print(int num) {
    6. cout << num << " ";
    7. }
    8. int main(void)
    9. {
    10. vector<int> v;
    11. int i;
    12. for (i = 1; i <= 10; i += 1) {
    13. v.push_back(i);
    14. }
    15. for_each(v.begin(), v.end(), print);
    16. return 0;
    17. }

    程序的输出是:

    1   2   3   4   5   6   7   8   9   10

    1. #include
    2. #include
    3. #include
    4. using namespace std;
    5. class print
    6. {
    7. public:
    8. void operator() (int num) {
    9. cout << num << " ";
    10. }
    11. };
    12. int main(void)
    13. {
    14. vector<int> v;
    15. int i;
    16. for (i = 1; i <= 10; i += 1) {
    17. v.push_back(i);
    18. }
    19. for_each(v.begin(), v.end(), print());
    20. return 0;
    21. }

    程序的输出是:

    1   2   3   4   5   6   7   8   9   10

    transform

    transform用于搬运容器到另一个容器中。函数原型是:

    transform(iterator beg1,iterator end1,iterator beg2,func)

    beg1是源容器开始迭代器,end1是源容器结束迭代器。beg2是目标容器开始迭代器。func是函数或函数对象。将beg1到end1的元素通过func的规则拷贝到beg2开始的区间。func可以对元素的值进行修改。

    用transform进行搬运时,必须提前分配空间。

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

    print类重载()实现元素的输出。tran类重载()将元素的值加10后返回。main函数创建了一个容器v1,加入1至10,然后创建了v2,并提前分配足够空间,然后将v1的所有元素按tran的规则(加10)拷贝给v2。

    程序的输出是:

    1   2   3   4   5   6   7   8   9   10
    11   12   13   14   15   16   17   18   19   20
     

    常用查找算法

    使用查找算法需要包含algortihm

    find

    find查找指定元素,找到返回指定元素的迭代器,找不到就返回end。函数原型是:

    find(iterator beg,iterator end,value)

    beg是开始位置,end是结束位置,value是要查找的元素。

    如果是自定义类型,要重载==。

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

    程序的输出是:

    Have found 5
    Not found

    1. #include
    2. #include
    3. #include
    4. #include
    5. using namespace std;
    6. class person
    7. {
    8. public:
    9. string name;
    10. int age;
    11. person(string name, int age) {
    12. this->name = name;
    13. this->age = age;
    14. }
    15. bool operator==(person p) {
    16. if (this->name == p.name && this->age == p.age) {
    17. return true;
    18. }
    19. else {
    20. return false;
    21. }
    22. }
    23. };
    24. int main(void)
    25. {
    26. vector v;
    27. person p1("Jimena", 19);
    28. person p2("Javier", 18);
    29. person p3("Julia", 22);
    30. person p4("Jova", 23);
    31. person p5("Jose", 21);
    32. v.push_back(p1);
    33. v.push_back(p2);
    34. v.push_back(p3);
    35. v.push_back(p4);
    36. v.push_back(p5);
    37. vector::iterator it;
    38. person pp("Javier", 18);
    39. it = find(v.begin(), v.end(), pp);
    40. if (it == v.end()) {
    41. cout << "Not found" << endl;
    42. }
    43. else {
    44. cout << "Have found" << endl;
    45. }
    46. person ppp("Julian", 19);
    47. it = find(v.begin(), v.end(), ppp);
    48. if (it == v.end()) {
    49. cout << "Not found" << endl;
    50. }
    51. else {
    52. cout << "Have found" << endl;
    53. }
    54. return 0;
    55. }

    person类有两个成员变量name和age,重载了==,只有两个类对象的name和age都相等才算相等。

    程序的输出是:

    Have found
    Not found

    find_if

    find_if按条件查找元素。找到就返回相关位置的迭代器,否则就返回end。函数原型是:

    find_if(iterator beg,iterator end,pred)

    beg表示开始,end表示结束,pred是一个函数或者谓词。

    1. #include
    2. #include
    3. #include
    4. using namespace std;
    5. class compare
    6. {
    7. public:
    8. bool operator() (int num) {
    9. return num > 5;
    10. }
    11. };
    12. int main(void)
    13. {
    14. vector<int> v;
    15. int i;
    16. for (i = 1; i <= 10; i += 1) {
    17. v.push_back(i);
    18. }
    19. vector<int>::iterator it;
    20. it = find_if(v.begin(), v.end(), compare());
    21. if (it == v.end()) {
    22. cout << "Not found" << endl;
    23. }
    24. else {
    25. cout << "Have found:" << *it << endl;
    26. }
    27. return 0;
    28. }

    程序的输出是:

    Have found:6

    1. #include
    2. #include
    3. #include
    4. #include
    5. using namespace std;
    6. class person
    7. {
    8. public:
    9. string name;
    10. int age;
    11. person(string name, int age) {
    12. this->name = name;
    13. this->age = age;
    14. }
    15. };
    16. class compare
    17. {
    18. public:
    19. bool operator()(person p) {
    20. return p.age > 20;
    21. }
    22. };
    23. int main(void)
    24. {
    25. vector v;
    26. person p1("John", 16);
    27. person p2("Juliette", 21);
    28. person p3("Kiko", 15);
    29. person p4("Kevin", 21);
    30. v.push_back(p1);
    31. v.push_back(p2);
    32. v.push_back(p3);
    33. v.push_back(p4);
    34. vector::iterator it;
    35. it = find_if(v.begin(), v.end(), compare());
    36. if (it == v.end()) {
    37. cout << "Not found" << endl;
    38. }
    39. else {
    40. cout << "Have found." << "The name is " << it->name << " and the age is " << it->age << endl;
    41. }
    42. return 0;
    43. }

    程序创建了person类,有成员变量name和age。compare类重载了(),返回类对象的age是否大于20。因此以这个函数对象作为参数的find_if函数将返回成员变量age大于20的第一个元素。

    程序的输出是:

    Have found.The name is Juliette and the age is 21

    abjacent_find

    abjacent_find用于查找相邻重复元素。函数原型是

    abjacent_find(iterator beg,iterator end)

    查找相邻重复元素,返回相邻元素的第一个位置的迭代器。beg表示开始,end表示结束。

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

    程序的输出是:

    Have found:10
     

    binary_search查找指定元素是否存在,找到返回true,找不到返回false。函数原型是:

    bool binary_search(iterator beg,iterator end,value)

    beg表示开始,end表示结束。value是要查找的元素。此函数必须在有序序列中用,否则会造成结果出错。这是由于此函数使用二分查找。

    1. #include
    2. #include
    3. #include
    4. using namespace std;
    5. int main(void)
    6. {
    7. vector<int> v;
    8. int i;
    9. for (i = 1; i <= 10; i += 1) {
    10. v.push_back(i);
    11. }
    12. bool flag = binary_search(v.begin(), v.end(), 6);
    13. if (flag == true) {
    14. cout << "Have found" << endl;
    15. }
    16. else {
    17. cout << "Not found" << endl;
    18. }
    19. return 0;
    20. }

    容器按照1至10依次放入容器,是有序的。

    程序的输出是:

    Have found

    count

    count用于统计元素个数。函数原型是:

    count(iterator beg,iterator end,value)

    beg表示开始,end表示结束,value是统计的元素。

    统计自定义类型需要重载==

    1. #include
    2. #include
    3. #include
    4. using namespace std;
    5. int main(void)
    6. {
    7. vector<int> v;
    8. v.push_back(10);
    9. v.push_back(20);
    10. v.push_back(40);
    11. v.push_back(50);
    12. v.push_back(20);
    13. v.push_back(30);
    14. cout << count(v.begin(), v.end(), 20) << endl;
    15. cout << count(v.begin(), v.end(), 60) << endl;
    16. return 0;
    17. }

    程序的输出是:

    2
    0
     

    1. #include
    2. #include
    3. #include
    4. #include
    5. using namespace std;
    6. class person
    7. {
    8. public:
    9. string name;
    10. int age;
    11. person(string name, int age) {
    12. this->name = name;
    13. this->age = age;
    14. }
    15. bool operator==(person p) {
    16. if (this->age == p.age) {
    17. return true;
    18. }
    19. else {
    20. return false;
    21. }
    22. }
    23. };
    24. int main(void)
    25. {
    26. vector v;
    27. person p1("Estelle", 20);
    28. person p2("Eugene", 19);
    29. person p3("Emily", 17);
    30. person p4("Emilia", 18);
    31. person p5("Erick", 23);
    32. person p6("Erin", 21);
    33. person p7("Elida", 20);
    34. v.push_back(p1);
    35. v.push_back(p2);
    36. v.push_back(p3);
    37. v.push_back(p4);
    38. v.push_back(p5);
    39. v.push_back(p6);
    40. v.push_back(p7);
    41. person pa("Laura", 20);
    42. person pb("Irma", 25);
    43. cout << count(v.begin(), v.end(), pa) << endl;
    44. cout << count(v.begin(), v.end(), pb) << endl;
    45. return 0;
    46. }

    程序创建了person类,有成员变量name和age,并重载了==,规定成员变量age相等就判为相等。

    程序的输出是:

    2
    0

    count_if

    count_if按条件统计元素个数。函数原型是:

    count_if(iterator beg,iterator end,pred)

    beg表示开始迭代器,end表示结束迭代器,pred是一个谓词。

    1. #include
    2. #include
    3. #include
    4. using namespace std;
    5. class compare
    6. {
    7. public:
    8. bool operator() (int num) {
    9. return num > 4;
    10. }
    11. };
    12. int main(void)
    13. {
    14. vector<int> v;
    15. int i;
    16. for (i = 1; i <= 10; i += 1) {
    17. v.push_back(i);
    18. }
    19. cout << count_if(v.begin(), v.end(), compare());
    20. return 0;
    21. }

    此程序的条件是值大于4。程序的输出是:

    6

    1. #include
    2. #include
    3. #include
    4. #include
    5. using namespace std;
    6. class person
    7. {
    8. public:
    9. string name;
    10. int age;
    11. person(string name, int age) {
    12. this->name = name;
    13. this->age = age;
    14. }
    15. };
    16. class compare
    17. {
    18. public:
    19. bool operator() (person p) {
    20. return p.age > 15;
    21. }
    22. };
    23. int main(void)
    24. {
    25. vector v;
    26. person p1("Danny", 17);
    27. person p2("Darby", 20);
    28. person p3("Danielle", 12);
    29. person p4("Dora", 19);
    30. person p5("Daniel", 16);
    31. person p6("Dorian", 13);
    32. person p7("Douglas", 14);
    33. v.push_back(p1);
    34. v.push_back(p2);
    35. v.push_back(p3);
    36. v.push_back(p4);
    37. v.push_back(p5);
    38. v.push_back(p6);
    39. v.push_back(p7);
    40. cout << count_if(v.begin(), v.end(), compare());
    41. return 0;
    42. }

    程序创建了person类,有成员变量name和age。条件是age成员变量大于15。

    程序的输出是:

    4

  • 相关阅读:
    margin的塌陷现象
    下载安装包,platform的含义
    【docker下安装jenkins】(一)
    量子笔记:布尔逻辑/代数、逻辑门、通用门、可逆计算
    MySQL 子查询
    Halcon Camera-calibration 相关算子(一)
    第八章 排序 三、希尔排序
    十年架构五年生活-08 第一次背锅
    广州蓝景分享—程序员在面试时必须要做的五件事,最后一件很重要
    Unity之Hololens2开发 如何接入的MRTK OpenXR Plugin
  • 原文地址:https://blog.csdn.net/m0_71007572/article/details/126436744