C++提高编程 5 STL -常用算法(查找算法)

5.2  常用查找算法

算法简介:
find     //查找元素

find_if    //按条件查找元素

adjacent_find  //查找到相邻重复元素

binary_search  //二分法查找

count      //统计元素个数

count_if     //按条件统计元素个数

 

5.1 find

功能描述:查找指定元素,找到返回指定元素的迭代器,找不到返回结束迭代器end()

函数原型:find(iterator beg, iterator end, value);  //value 查找的元素

#include<iostream>
using namespace std;
#include<vector>   
#include<algorithm>
#include<string>

//常用查找容器  find
void test1()
{
    vector<int>v;
    for (int i = 0; i < 10; i++)
    {
        v.push_back(i);
    }

    //查找容器中 是否有5 这个元素
    vector<int>::iterator pos = find(v.begin(), v.end(), 5);
    if (pos == v.end())
    {
        cout << "无要查找的元素" << endl;
    }
    else
    {
        cout << "有所查找的元素" << 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 test2()
{
    vector<Person>v;
    //创建数据
    Person p1("张三", 40);
    Person p2("李四", 50);
    Person p3("王五", 60);
    Person p4("赵六", 70);

    //放入到容器中
    v.push_back(p1);
    v.push_back(p2);
    v.push_back(p3);
    v.push_back(p4);

    Person pp("李四", 50);

    vector<Person>::iterator pos = find(v.begin(), v.end(), pp);
    if (pos == v.end())
    {
        cout << "无姓名年龄相同的人" << endl;
    }
    else
    {
        cout << "有姓名年龄相同的人" << endl;
    }
}

int main()
{
    test1();

    system("pause");
    return 0;
}

总结:find可以在容器中找指定的元素,但是要注意 返回值是一个迭代器

 

5.2.2  find_if

功能描述:按条件查找元素

函数原型:find_if(iterator beg, iterator end, _Pred);  //_Pred 函数或谓词(返回bool类型的仿函数)

#include<iostream>
using namespace std;
#include<vector>
#include<algorithm>

//常用查找算法  find_if

//1、查找内置数据类型
class GreaterFive
{
public:
    bool operator()(int val)
    {
        return val > 5;
    }
};

void test1()
{
    vector<int>v;
    for (int i = 0; i < 10; i++)
    {
        v.push_back(i);
    }
    vector<int>::iterator pos = find_if(v.begin(), v.end(), GreaterFive());
    if (pos == v.end())
    {
        cout << "没有大于5的数" << endl;
    }
    else
    {
        cout << "有大于5的数:" << *pos << endl;
    }
}

//2、查找自定义数据类型


int main()
{
    test1();
    
    system("pause");
    return 0;
}

内置数据类型:

 

 

 

#include<iostream>
using namespace std;
#include<vector>
#include<algorithm>
#include<string>

//常用查找算法  find_if//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 test2()
{
    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 << "没有找到年龄大于20的人" << endl;
    }
    else
    {
        cout << "找到年龄大于20的人:" << (*it).m_Name << " " << "年龄:" << it->m_Age << endl;
    }

}

int main()
{
    test2();
    
    system("pause");
    return 0;
}

自定义数据类型:

 

 

 

5.2.3  adjacent_find

功能描述:查找相邻重复元素

函数原型:adjacent_find(iterator beg, iterator end);  //查找到相邻重复元素,返回相邻元素的第一个位置的迭代器

#include<iostream>
using namespace std;
#include<vector>
#include<algorithm>

//常用查找算法  adjacent_find

void test1()
{
    vector<int>v;
    v.push_back(1);
    v.push_back(0);
    v.push_back(0);
    v.push_back(3);
    v.push_back(3);
    v.push_back(0);
    v.push_back(0);

    vector<int>::iterator pos = adjacent_find(v.begin(), v.end());
    if (pos == v.end())
    {
        cout << "未找到相邻重复元素" << endl;
    }
    else
    {
       cout << "找到相邻重复元素" << *pos << endl;        //找到相邻重复元素0   返回相邻元素的第一个位置的迭代器
    }
}

int main()
{
    test1();
    
    system("pause");
    return 0;
}

 

5.2.4  binary_search

功能描述:查找指定元素是否存在

函数原型:bool binary_search(iterator beg, iterator end, value);  //查找指定元素,查到返回true,否则返回false。value为查找的元素

注意:在无序序列中不能使用!!!

#include<iostream>
using namespace std;
#include<vector>
#include<algorithm>

//常用查找算法  binary_search  (二分查找法)

void test1()
{
    vector<int>v;
    v.push_back(0);
    v.push_back(1);
    v.push_back(2);
    v.push_back(3);
    v.push_back(4);
    v.push_back(5);
    v.push_back(6);

    //查找容器中是否有5这个元素
    //注意:在无序序列中不能使用!!!(降序也不行)  结果未知

    bool ret = binary_search(v.begin(), v.end(), 5);
    if (ret == false)
    {
        cout << "未找到" << endl;
    }
    else
    {
        cout << "找到了" << endl;        //找到了
    }
}

int main()
{
    test1();
    
    system("pause");
    return 0;
}

 

5.2.5 count

功能描述:统计元素个数

函数原型:count(iterator beg, iterator end, value);  //统计元素出现次数

#include<iostream>
using namespace std;
#include<vector>
#include<algorithm>

//常用查找算法  count

//1、查找内置数据类型
void test1()
{
    vector<int>v;
    v.push_back(10);
    v.push_back(10);
    v.push_back(20);
    v.push_back(30);
    v.push_back(40);

    int num = count(v.begin(), v.end(), 10);
    cout << "10的个数为:" << num << endl;        //10的个数为:2

}

//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 test2()
{
    vector<Person>v;
    //创建数据
    Person p1("aaa", 10);
    Person p2("bbb", 20);
    Person p3("ccc", 30);
    Person p4("ddd", 40);
    Person p5("eee", 40);

    v.push_back(p1);
    v.push_back(p2);
    v.push_back(p3);
    v.push_back(p4);
    v.push_back(p5);

    Person p("xkl", 40);
    int num = count(v.begin(), v.end(), p);
    cout << "与xkl同岁数的人数为:" << num << endl;            //与xkl同岁数的人数为:2
}

int main()
{
    test1();
    test2();
    system("pause");
    return 0;
}

总结:查找自定义数据类型时,需要重载operator==

 

 

5.2.6 count_if

功能描述:按条件统计元素出现的个数

函数原型:count_if(iterator beg, iterator end, _Pred);  //_Pred谓词

#include<iostream>
using namespace std;
#include<vector>
#include<algorithm>

//常用查找算法  count_if

class Greater20
{
public:
    bool operator()(int val)
    {
        return val > 20;
    }
};

//1、统计内置数据类型
void test1()
{
    vector<int>v;

    v.push_back(40);
    v.push_back(10);
    v.push_back(20);
    v.push_back(30);
    v.push_back(40);

    int num = count_if(v.begin(), v.end(), Greater20());
    cout << "容器中大于20的个数为:" << num << endl;        //容器中大于20的个数为:3

}

//2、统计自定义数据类型
class Person
{
public:
    Person(string name, int age)
    {
        this->m_Name = name;
        this->m_Age = age;
    }
    string m_Name;
    int m_Age;
};

class AgeGreater30
{
public:
    bool operator()(const Person &p)
    {
        return p.m_Age > 30;
    }
};

void test2()
{
    vector<Person>v;
    //创建数据
    Person p1("aaa", 40);
    Person p2("bbb", 20);
    Person p3("ccc", 30);
    Person p4("ddd", 40);
    Person p5("eee", 40);

    v.push_back(p1);
    v.push_back(p2);
    v.push_back(p3);
    v.push_back(p4);
    v.push_back(p5);

    //统计大于30岁的人数
    int num = count_if(v.begin(), v.end(), AgeGreater30());
    cout << "大于20岁的人数为:" << num << endl;            //大于20岁的人数为:3
}

int main()
{
    test1();
    test2();
    system("pause");
    return 0;
}

 

posted @ 2022-03-03 17:58  大白不会敲代码  阅读(65)  评论(0)    收藏  举报