stl中查找元素,很多情况下都会用到find和find_if,那么两者的用法是什么?有什么区别呢?
1.find
find的用法是
template <class _InIt, class _Ty>
_NODISCARD _CONSTEXPR20 _InIt find(_InIt _First, const _InIt _Last, const _Ty& _Val) { // find first matching _Val
_Adl_verify_range(_First, _Last);
_Seek_wrapped(_First, _Find_unchecked(_Get_unwrapped(_First), _Get_unwrapped(_Last), _Val));
return _First;
}
find的前两个变量是一段迭代器的范围,最后一个参数是个类型引用,所以如果该类型不是标准类型,而是我们自定义的类型的话,就需要我们重写==操作符
class find_test {
public:
find_test(int num) : test_(num) {}
~find_test() {}
find_test(const find_test& other) {
test_ = other.test_;
}
find_test& operator=(const find_test& other) {
test_ = other.test_;
return *this;
}
bool operator==(const find_test& other) const{
return test_ == other.test_;
}
int get() const { return test_; }
private:
int test_;
};
int main()
{
std::vector<find_test> vec;
find_test f1(1);
find_test f2(2);
vec.push_back(f1);
vec.push_back(f2);
if (vec.end() != find(vec.begin(), vec.end(), f2)) {
std::cout << "find f2, f2 value is " << f2.get() << std::endl;
}
}
find f2, f2 value is 2
如果我们把上例中的==操作符删除的话,使用find就会报错,此时我们可以find_if来解决
2.find_if
template <class _InIt, class _Pr>
_NODISCARD _CONSTEXPR20 _InIt find_if(_InIt _First, const _InIt _Last, _Pr _Pred) { // find first satisfying _Pred
_Adl_verify_range(_First, _Last);
auto _UFirst = _Get_unwrapped(_First);
const auto _ULast = _Get_unwrapped(_Last);
for (; _UFirst != _ULast; ++_UFirst) {
if (_Pred(*_UFirst)) {
break;
}
}
_Seek_wrapped(_First, _UFirst);
return _First;
}
find_if的前两个参数和find一样,区别在第三个参数上面,find_if接收一个函数对象,因此可以使用lambda表达式来解决,如上述例子可以如下写:
class find_test {
public:
find_test(int num) : test_(num) {}
~find_test() {}
find_test(const find_test& other) {
test_ = other.test_;
}
find_test& operator=(const find_test& other) {
test_ = other.test_;
return *this;
}
int get() const { return test_; }
private:
int test_;
};
int main()
{
std::vector<find_test> vec;
find_test f1(1);
find_test f2(2);
vec.push_back(f1);
vec.push_back(f2);
if (vec.end() != find_if(vec.begin(), vec.end(), [f2](const find_test& other) {
return f2.get() == other.get(); }
)) {
std::cout << "find f2, f2 value is " << f2.get() << std::endl;
}
}
find f2, f2 value is 2
需要注意的是,如果容器中有多个满足条件,find和find_if都是返回第一个满足条件的。