find和find_if用法

本文介绍了STL容器find函数在set和map中的高效应用,以及在list和vector中使用std::find的情况。同时讲解了find_if的用法,重点在于自定义函数和lambda表达式的使用,以查找复杂类型元素。
摘要由CSDN通过智能技术生成

一、find的用法

STL容器中有很多find,比如说set,map。他们内部都有内置的find函数,一般情况下,如果我们用到这些容器,那么我们直接用它的内置find就可以了。(这是因为map和set中内置的find函数比std::find时间复杂度要低,速度更快)。但是像list,vector这些容器是没有find函数的,所以我们只能用默认的std::find来进行查找。首先说一下find函数的原型:

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

我们从find的定义中可以看到,find内部一共包含三个参数,第一个参数和第二个参数指的是迭代器的头部和尾端,而第三个参数表示的是要比较的值。(不过这里要注意这个值必须是const类型的,所以我们在后面的赋值过程中也要赋值成const类型)。举个例子:

std::vector<int> score{ 10, 20, 30, 40 };
int key = 10;
auto itor = std::find(score.begin(), score.end(), key);
if (score.end() != itor)
    std::cout << "找到了\n";
else
    std::cout << "没有找到\n"; 

如果说我们传入的vector或者list容器不是一个基本类型?比如这样:

class CPerson
{
public:
    CPerson(void); 
    ~CPerson(void);

    int getage()
    {
        return age;
    }

private:
    int age; // 年龄
};


/*比较其中的age是否相等*/
std::vector<CPerson> score;
CPerson c;
c.age = 20;

auto itor = std::find(score.begin(), score.end(), c);  //这样肯定会编译报错

此时需要重载==运算符,如这样

class CPerson
{
public:
    CPerson(void); 
    ~CPerson(void);

    int getage()
    {
        return age;
    }

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

private:
    int age; // 年龄
};

二、find_if的用法

find_if上也有三个参数,其中前两个参数是和find代表是相同的,但是第三个参数是我们自定义的函数。为了方便, 加入lambda表达式,示例如下

class CPerson
{
public:
	CPerson(void) {}
	~CPerson(void) {}

public:
	int age; // 年龄
};

int main()
{
	int key = 30;
	vector<CPerson> score;
	CPerson c1;
	c1.age = 20;
	score.push_back(c1);

    CPerson c2;
	c2.age = 20;
	score.push_back(c2);

	auto itor = std::find_if(score.begin(), score.end(), [key](const CPerson& rhs) { 
		return key == rhs.age; 
	});
	if (itor != score.end())
		std::cout << "yes" << endl;
	else
		std::cout << "no" << endl;

	system("pause");
	return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值