一、find函数

STL的find函数提供了一种对数组、STL容器内的元素进行查找的方法。使用该函数,需要加上#include <algorithm>。

函数原型:

template<class InputIterator, class T>
  InputIterator find (InputIterator first, InputIterator last, const T& val)
{
  while (first!=last) {
    if (*first==val) return first;
    ++first;
  }
  return last;
}

该函数返回一个迭代器到范围[first,last)中等于val的第一个元素。如果没有找到这样的元素,函数将返回last。函数使用运算符==将各个元素与val进行比较。

参数:first,last:
将迭代器输入到序列的初始和最终位置。搜索的范围是[first,last],它包含first和last之间的所有元素,包括first指向的元素,而不是last指向的元素。

val:要在范围中搜索的值。

T应为支持与InputIterator使用运算符==(元素为左侧操作数,val为右侧操作数)的元素进行比较的类型。

返回值:等于val的范围中第一个元素的迭代器。

1.1 内置类型的查找

如果是C++内置的类型,比如int,double,string等,直接使用就行了

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

int main()
{
    vector<int> nums;
    nums.push_back(10);
    nums.push_back(20);
    nums.push_back(30);
    vector<int>::iterator it = find(nums.begin(), nums.end(), 10); // 查找vector中是否有元素“10”
    if (it != nums.end()) // 找到了
    {
        cout << *it << endl;// do something 
    }
    else // 没找到
    {
        cout << "not find" << endl;// do something
    }
    system("pause");
	return 0;
}

1.2 自定义类的查找

 如果是自定义类型,比如自定义的一个CPerson类,那么如何用find()函数进行查找呢?这时,我们需要提供一个判断两个CPerson对象“相等”的定义,find()函数才能从一个list中找到与指定的CPerson“相等”的元素。
      这个“相等”的定义,是通过重载“==”操作符实现的,我们在CPerson类中添加一个方法,定义为:
       bool operator==(const CPerson &rhs) const;

这样就可以进行查找了


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


class CPerson
{
public:
	CPerson(void) {};
	CPerson(int age):m_age(age)
	{
		
	};

	~CPerson(void) {};

	bool operator==(const CPerson &rhs) const
	{
		return (m_age == rhs.m_age);
	}

	CPerson(const CPerson & c)
	{
		m_age = c.m_age;

	}

public:
	int m_age; // 年龄
};

int main()
{
	list<CPerson> lst;
	CPerson *temp1 = new CPerson(10);
	CPerson *temp2 = new CPerson(20);
	CPerson *temp3 = new CPerson(50);
	lst.push_back(*temp1);// 向lst中添加元素
	lst.push_back(*temp2);
	lst.push_back(*temp3);

	CPerson cp_to_find; // 要查找的对象
	cp_to_find.m_age = 20;

	list<CPerson>::iterator it = find(lst.begin(), lst.end(), cp_to_find); // 查找list中是否有
	if (it != lst.end()) // 找到了
	{
		cout << (*it).m_age << endl;// do something 
	}
	else // 没找到
	{
		cout << "not find" << endl;// do something
	}
    system("pause");
	return 0;
}

打印

二、find_if函数

find_if函数 带条件的查找元素,可以通过find_if函数来实现查找满足特定条件的元素。find_if函数依次的遍历容器的元素,返回第一个使函数为true的元素的迭代器,如果查找失败则返回end迭代器。它与find函数的区别就是不用重写==,而是自己定义查找条件。

函数原型

template<class InputIterator, class UnaryPredicate>
  InputIterator find_if (InputIterator first, InputIterator last, UnaryPredicate pred)
{
  while (first!=last) {
    if (pred(*first)) return first;
    ++first;
  }
  return last;
}

查找map键值对,使用仿函数

#include <iostream>
#include <string>
#include <algorithm>
#include <map>

class map_value_finder
{
public:
    map_value_finder(const std::string &cmp_string) :m_s_cmp_string(cmp_string) {}
    bool operator ()(const std::map<int, std::string>::value_type &pair) // 仿函数
    {
        return pair.second == m_s_cmp_string;
    }
private:
    const std::string &m_s_cmp_string;
};

int main()
{
    std::map<int, std::string> my_map;
    my_map.insert(std::make_pair(10, "china"));
    my_map.insert(std::make_pair(20, "usa"));
    my_map.insert(std::make_pair(30, "English"));
    my_map.insert(std::make_pair(40, "hongkong"));

    std::map<int, std::string>::iterator it = my_map.end();
    it = std::find_if(my_map.begin(), my_map.end(), map_value_finder("English"));
    if (it == my_map.end()) {
        printf("not found\n");
    }
    else {
        printf("found key:%d value:%s\n", it->first, it->second.c_str());
    }
    return 0;
}

打印

 查找结构体,使用lamda表达式

#include <iostream>
#include <vector>
#include <algorithm>

typedef struct testStruct
{
    int a;
    int b;
};

int main()
{
    vector<testStruct> testStructVector = { {3,3},{0,2} };

    auto itrFind = find_if(testStructVector.begin(), testStructVector.end(), [](testStruct myStruct) {

        return myStruct.a > 2 && myStruct.b < 8;
    });

    if (itrFind != testStructVector.end()) {
        cout << "found!";
    }

    else {
        cout << "not found!";
    }
    return 0;
}

查找自定义的类 ,使用普通的bool全局函数


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


class CPerson
{
public:
	CPerson(void) {};
	CPerson(int age):m_age(age)
	{
		
	};

	~CPerson(void) {};

	bool operator==(const CPerson &rhs) const
	{
		return (m_age == rhs.m_age);
	}

	CPerson(const CPerson & c)
	{
		m_age = c.m_age;

	}

public:
	int m_age; // 年龄
};


//自定义的find函数,要求age=10
bool Equal_10(CPerson &rhs) {
	return (rhs.m_age == 10);
}

int main()
{
	list<CPerson> lst;
	CPerson *temp1 = new CPerson(30);
	CPerson *temp2 = new CPerson(20);
	CPerson *temp3 = new CPerson(50);
	lst.push_back(*temp1);// 向lst中添加元素
	lst.push_back(*temp2);
	lst.push_back(*temp3);

	CPerson cp_to_find; // 要查找的对象
	cp_to_find.m_age = 20;

	list<CPerson>::iterator it = find_if(lst.begin(), lst.end(), Equal_10); // 查找list中是否有
	if (it != lst.end()) // 找到了
	{
		cout << (*it).m_age << endl;// do something 
	}
	else // 没找到
	{
		cout << "not find" << endl;// do something
	}

	return 0;
}

打印

 参考:

find_if - C++ Reference

find - C++ Reference

C++11 find和find_if的用法_zzhongcy的博客-CSDN博客_find_if

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐