zoukankan      html  css  js  c++  java
  • c++STL之常用查找算法

    引入#include<algorithm>

    算法简介:

    • find:查找元素
    • find_if:按条件查找
    • adjacent_find:查找相邻房重复的元素
    • binary_search:二分查找
    • count:统计元素个数
    • count_if:按条件统计元素个数

    1.find

    #include<iostream>
    using namespace std;
    #include <vector>
    #include <algorithm>
    #include <string>
    
    //常用查找算法
    //find
    
    //查找 内置数据类型
    void test01()
    {
        vector<int>v;
        for (int i = 0; i < 10; i++)
        {
            v.push_back(i);
        }
    
        //查找 容器中 是否有 5 这个元素
        vector<int>::iterator it = find(v.begin(), v.end(), 5);
        if (it == v.end())
        {
            cout << "没有找到!" << endl;
        }
        else
        {
            cout << "找到: " << *it << endl;
        }
    }
    
    
    class Person
    {
    public:
        Person(string name, int age)
        {
            this->m_Name = name;
            this->m_Age = age;
        }
    
        //重载 ==  底层find知道如何对比person数据类型
        bool operator==( const Person & p)
        {
            if (this->m_Name == p.m_Name && this->m_Age == p.m_Age)
            {
                return true;
            }
            else
            {
                return false;
            }
        }
        string m_Name;
        int m_Age;
    };
    
    //查找 自定义数据类型
    void test02()
    {
        vector<Person>v;
        //创建数据
        Person p1("aaa", 10);
        Person p2("bbb", 20);
        Person p3("ccc", 30);
        Person p4("ddd", 40);
    
        //放入到容器中
        v.push_back(p1);
        v.push_back(p2);
        v.push_back(p3);
        v.push_back(p4);
    
        Person pp("bbb", 20);
    
        vector<Person>::iterator it = find(v.begin(), v.end(), pp);
        if (it == v.end())
        {
            cout << "没有找到" << endl;
        }
        else
        {
            cout << "找到元素  姓名:" << it->m_Name << " 年龄: " << it->m_Age << endl;
        }
    }
    
    int main() {
    
        //test01();
    
        test02();
    
        system("pause");
    
        return 0;
    }

    2.find_if

    #include<iostream>
    using namespace std;
    #include <vector>
    #include <algorithm>
    #include <string>
    //常用查找算法 find_if
    
    //1、查找内置数据类型
    class GreaterFive
    {
    public:
        bool operator()(int val)
        {
            return val > 5;
        }
    };
    
    void test01()
    {
        vector<int>v;
        for (int i = 0; i < 10; i++)
        {
            v.push_back(i);
        }
    
        vector<int>::iterator it = find_if(v.begin(), v.end(), GreaterFive());
    
        if (it == v.end())
        {
            cout << "没有找到" << endl;
        }
        else
        {
            cout << "找到大于5的数字为: " << *it << endl;
        }
    
    }
    
    //2、查找自定义数据类型
    class Person
    {
    public:
        Person(string name, int age)
        {
            this->m_Name = name;
            this->m_Age = age;
        }
        string m_Name;
        int m_Age;
    };
    
    class Greater20
    {
    public:
        bool operator()(Person &p)
        {
            return  p.m_Age > 20;
        }
    };
    
    void test02()
    {
        vector<Person>v;
    
        //创建数据
        Person p1("aaa", 10);
        Person p2("bbb", 20);
        Person p3("ccc", 30);
        Person p4("ddd", 40);
    
        v.push_back(p1);
        v.push_back(p2);
        v.push_back(p3);
        v.push_back(p4);
    
        //找年龄大于20的人
        vector<Person>::iterator it = find_if(v.begin(), v.end(), Greater20());
    
        if (it == v.end())
        {
            cout << "没有找到" << endl;
        }
        else
        {
            cout << "找到姓名: " << it->m_Name << " 年龄: " << it->m_Age << endl;
        }
    }
    
    int main() {
    
        //test01();
    
        test02();
    
        system("pause");
    
        return 0;
    }

    3.adjacent_find

    #include<iostream>
    using namespace std;
    #include <vector>
    #include <algorithm>
    
    //常用查找算法 adjacent_find
    void test01()
    {
        vector<int>v;
        v.push_back(0);
        v.push_back(2);
        v.push_back(0);
        v.push_back(3);
        v.push_back(1);
        v.push_back(4);
        v.push_back(3);
        v.push_back(3);
    
        vector<int>::iterator  pos = adjacent_find(v.begin(), v.end());
     
        if (pos == v.end())
        {
            cout << "未找到相邻重复元素" << endl;
        }
        else
        {
            cout << "找到相邻重复元素:" << *pos << endl;
        }
    
    }
    
    int main() {
    
        test01();
    
        system("pause");
    
        return 0;
    }

    4.binary_search

    #include<iostream>
    using namespace std;
    #include <vector>
    #include <algorithm>
    
    //常用查找算法 binary_search
    void test01()
    {
        vector<int>v;
        for (int i = 0; i < 10; i++)
        {
            v.push_back(i);
        }
        //v.push_back(2);  如果是无序序列,结果未知!
        //查找容器中是否有9 元素
        //注意:容器必须是有序的序列
        bool ret = binary_search(v.begin(), v.end(), 9);
    
        if (ret)
        {
            cout << "找到了元素" << endl;
        }
        else
        {
            cout << "未找到" << endl;
        }
    }
    
    int main() {
    
        test01();
    
        system("pause");
    
        return 0;
    }

    5.count

    #include<iostream>
    using namespace std;
    #include <vector>
    #include <algorithm>
    #include <string>
    //常用查找算法_count
    
    //1、统计内置数据类型
    
    void test01()
    {
        vector<int>v;
    
        v.push_back(10);
        v.push_back(40);
        v.push_back(30);
        v.push_back(40);
        v.push_back(20);
        v.push_back(40);
    
        int num = count(v.begin(), v.end(), 40);
    
        cout << "40的元素个数为: " << num << endl;
    }
    
    //2、统计自定义数据类型
    
    class Person
    {
    public:
        Person(string name, int age)
        {
            this->m_Name = name;
            this->m_Age = age;
        }
    
        bool operator==(const Person & p)
        {
            if (this->m_Age == p.m_Age)
            {
                return true;
            }
            else
            {
                return false;
            }
        }
    
        string m_Name;
        int m_Age;
    };
    
    void test02()
    {
        vector<Person>v;
    
        Person p1("刘备", 35);
        Person p2("关羽", 35);
        Person p3("张飞", 35);
        Person p4("赵云", 30);
        Person p5("曹操", 40);
    
        //将人员插入到容器中
        v.push_back(p1);
        v.push_back(p2);
        v.push_back(p3);
        v.push_back(p4);
        v.push_back(p5);
    
        Person p("诸葛亮", 35);
    
        int num = count(v.begin(), v.end(), p);
    
        cout << "和诸葛亮同岁数的人员个数为:" << num << endl;
    }
    
    int main() {
        
        //test01();
    
        test02();
    
        system("pause");
    
        return 0;
    }

    6.count_if

    #include<iostream>
    using namespace std;
    #include <vector>
    #include <algorithm>
    
    //常用查找算法  count_if
    
    //统计内置数据类型
    class Greater20
    {
    public:
        bool operator()(int val)
        {
            return val > 20;
        }
    };
    
    void test01()
    {
        vector<int>v;
        v.push_back(10);
        v.push_back(40);
        v.push_back(30);
        v.push_back(20);
        v.push_back(40);
        v.push_back(20);
    
        int num = count_if(v.begin(), v.end(), Greater20());
    
        cout << "大于20的元素个数为: " << num << endl;
    }
    
    class Person
    {
    public:
        Person(string name, int age)
        {
            this->m_Name = name;
            this->m_Age = age;
        }
        string m_Name;
        int m_Age;
    };
    
    class AgeGreater20
    {
    public:
        bool operator()(const Person& p)
        {
            return p.m_Age > 20;
        }
    };
    
    //统计自定义数据类型
    void test02()
    {
        vector<Person>v;
    
        Person p1("刘备", 35);
        Person p2("关羽", 35);
        Person p3("张飞", 35);
        Person p4("赵云", 40);
        Person p5("曹操", 20);
    
        v.push_back(p1);
        v.push_back(p2);
        v.push_back(p3);
        v.push_back(p4);
        v.push_back(p5);
    
        //统计  大于20岁人员个数
        int num = count_if(v.begin(), v.end(), AgeGreater20());
        cout << "大于20岁的人员个数为:" << num << endl;
    }
    
    int main() {
    
        //test01();
    
        test02();
    
        system("pause");
    
        return 0;
    }
  • 相关阅读:
    A1066 Root of AVL Tree (25 分)
    A1099 Build A Binary Search Tree (30 分)
    A1043 Is It a Binary Search Tree (25 分) ——PA, 24/25, 先记录思路
    A1079; A1090; A1004:一般树遍历
    A1053 Path of Equal Weight (30 分)
    A1086 Tree Traversals Again (25 分)
    A1020 Tree Traversals (25 分)
    A1091 Acute Stroke (30 分)
    A1103 Integer Factorization (30 分)
    A1032 Sharing (25 分)
  • 原文地址:https://www.cnblogs.com/xiximayou/p/12114737.html
Copyright © 2011-2022 走看看