一、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;
}