find和find_if

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都是返回第一个满足条件的。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容