暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

C++高级学习:第十八节-查找算法(下)

Cpp入门到精通 2024-03-18
78

点击蓝字 关注我们

c++高级学习

第十八节  查找算法(下)


      上一节我们介绍了四种查找函数,分别是find()查找单个指定元素,find_if()查找满足条件的元素,adjacent_find()查找相邻重复元素,binary_search执行二分查找。这节我们继续有关查找的一些函数。

search 用于在序列中搜索子序列的算法。

该函数接受四个迭代器参数,分别是:前两个参数为主序列的迭代器范围,后两个是子序列的迭代器范围。如以下例子:

    vector<int>v1 = { 10,20,30,40,50,60 };
    cout << "v1容器:";
    for_each(v1.begin(), v1.end(), print);
    cout << endl;
    vector<int>v2 = { 20,30,40 };
    cout << "v2容器:";
    for_each(v2.begin(), v2.end(), print);
    cout << endl;
    auto it = search(v1.begin(), v1.end(), v2.begin(), v2.end());
    if (it != v1.end()) {
    cout << "在v1中找到子序列v2" << endl;
    cout << "它的位置在:" << distance(v1.begin(),it) << endl;
    }
    else {
    cout << "未找到子序列!" << endl;
    }

    search会在主序列 [v1.begin(),v1.end()) 中搜索第一个与子序列 [v2.begin(),v2.end()) 匹配的位置,并返回一个指向此匹配位置的迭代器。如果未找到匹配位置,则返回v1.end()。然后使用distance 函数返回两个迭代器之间的距离。

      v1容器:10 20 30 40 50 60
      v2容器:20 30 40
      在v1中找到子序列v2
      它的位置在:1

      search_n 用于在序列中搜索连续出现指定数量指定值

      这个函数接受四个参数:前两个为待查找序列的迭代器范围,第三个参数表示要搜索的特定值的连续出现的次数,第四个参数表示要搜索的特定值。

        vector<int>v1 = { 10,20,20,30,40,20,20,20,50,60 };
        cout << "v1容器:";
        for_each(v1.begin(), v1.end(), print);
        cout << endl;
        auto it = search_n(v1.begin(), v1.end(), 3, 20);
        if (it != v1.end()) {
        cout << "在序列中找到3个连续的20!" << endl;
        cout << "它的位置在:" <<distance(v1.begin(),it) << endl;
        }
        else {
        cout << "未找到3个连续的20!" << endl;
        }

        search_n 会在序列 [v1.begin(),v1.end()) 中搜索连续出现3次值为20 的子序列,并返回一个指向匹配位置的迭代器。如果未找到匹配位置,则返回 v1.end()。

          v1容器:10 20 20 30 40 20 20 20 50 60
          在序列中找到3个连续的20!
          它的位置在:5

          find_first_of用于在序列中搜索另一个序列中的任意一个元素第一次出现位置。

          该函数接受四个迭代器参数,分别是:前两个参数为被查找序列的迭代器范围,后两个是的另一迭代器范围。

            vector<int>v1 = { 10,20,30,40,50,60 };
            cout << "v1容器:";
            for_each(v1.begin(), v1.end(), print);
            cout << endl;
            vector<int>v2 = { 80,70,60,50 };
            cout << "v2容器:";
            for_each(v2.begin(), v2.end(), print);
            cout << endl;
            auto it = find_first_of(v1.begin(), v1.end(), v2.begin(),v2.end());
            if (it != v1.end()) {
            cout << "在序列v1中找到v2中的元素" << endl;
            cout << "它的位置在:" <<distance(v1.begin(),it) << endl;
            }
            else {
            cout << "未找到元素!" << endl;
            }

            find_first_of 会在序列 [v1.begin(),v1.end()) 中搜索任意一个属于序列 [v2.begin(),v2.end()) 的元素第一次出现位置,并返回一个指向该位置的迭代器。如果未找到匹配位置,则返回 v1.end()。上述例子中找到的元素为50。

              v1容器:10 20 30 40 50 60
              v2容器:80 70 60 50
              在序列v1中找到v2中的元素
              它的位置在:4

              find_end 用于在序列中搜索另一个序列的最后一次出现位置。

              该函数接受四个迭代器参数,分别是:前两个参数为主序列的迭代器范围,后两个是子序列的迭代器范围。

                vector<int>v1 = { 10,20,30,40,50,20,30,60 };
                cout << "v1容器:";
                for_each(v1.begin(), v1.end(), print);
                cout << endl;
                vector<int>v2 = { 20,30 };
                cout << "v2容器:";
                for_each(v2.begin(), v2.end(), print);
                cout << endl;
                auto it = find_end(v1.begin(), v1.end(), v2.begin(), v2.end());
                if (it != v1.end()) {
                cout << "在v1中找到序列v2" << endl;
                cout << "它最后一次出现的位置在:" << distance(v1.begin(), it) << endl;
                }
                else {
                cout << "未找到子序列!" << endl;
                }

                find_end会在主序列 [v1.begin(),v1.end()) 中搜索最后一个与子序列 [v2.begin(),v2.end()) 匹配的位置(与search相异),并返回一个指向此匹配位置的迭代器。如果未找到匹配位置,则返回v1.end()。

                  v1容器:10 20 30 40 50 20 30 60
                  v2容器:20 30
                  在v1中找到序列v2
                  它最后一次出现的位置在:5

                  查找算法的相关操作的讲解到此结束,感谢观看!欢迎各位的点赞与关注!您的点赞和关注是我学习更新的动力!

                  END

                  往期推荐

                  C++高级学习:第十七节-查找算法(上)

                  C++高级学习:第十六节-count算法

                  C++高级学习:第十五节-算法概述

                  C++高级学习:第十四节-multiset&multimap

                  分享、在看与点赞,至少我要拥有一个吧

                  文章转载自Cpp入门到精通,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                  评论