STL_02: find/find_if/find_if_not函数
文章目录
0x00 find()函数
//定义于头文件 <algorithm>
template< class InputIt, class T >
InputIt find( InputIt first, InputIt last, const T& value );
(C++20 前)[1]
template< class InputIt, class T >
constexpr InputIt find( InputIt first, InputIt last, const T& value );
(C++20 起)[2]
template< class ExecutionPolicy, class ForwardIt, class T >
ForwardIt find( ExecutionPolicy&& policy, ForwardIt first, ForwardIt last, const T& value );(C++17 起)[3]
返回范围 [first, last)
中满足特定判别标准的首个元素:
- [1] [2]
find
搜索等于value
的元素。 - [3] 同 [1] [2] ,但按照
policy
执行。这些重载仅若 std::is_execution_policy_v<std::decay_t>> 为 true 才参与重载决议。
0x01 find_if()函数
//定义于头文件 <algorithm>
template< class InputIt, class UnaryPredicate >
InputIt find_if( InputIt first, InputIt last, UnaryPredicate p );
(C++20 前)[1]
template< class InputIt, class UnaryPredicate >
constexpr InputIt find_if( InputIt first, InputIt last, UnaryPredicate p );
(C++20 起)[2]
template< class ExecutionPolicy, class ForwardIt, class UnaryPredicate >
ForwardIt find_if( ExecutionPolicy&& policy, ForwardIt first, ForwardIt last,
UnaryPredicate p );
(C++17 起)[3]
- [1] [2]
find_if
搜索谓词p
对其返回 true 的元素。 - [3] 同 [1] [2] ,但按照
policy
执行。这些重载仅若 std::is_execution_policy_v<std::decay_t>> 为 true 才参与重载决议
0x02 find_if_not()函数
template< class InputIt, class UnaryPredicate >
InputIt find_if_not( InputIt first, InputIt last, UnaryPredicate q );
(C++11 起)(C++20 前)[1]
template< class InputIt, class UnaryPredicate >
constexpr InputIt find_if_not( InputIt first, InputIt last, UnaryPredicate q );
(C++20 起)[2]
template< class ExecutionPolicy, class ForwardIt, class UnaryPredicate >
ForwardIt find_if_not( ExecutionPolicy&& policy, ForwardIt first, ForwardIt last,
UnaryPredicate q );
(C++17 起)[3]
- [1] [2]
find_if_not
搜索谓词q
对其返回 false 的元素。 - [3] 同 [1] [2] ,但按照
policy
执行。这些重载仅若 std::is_execution_policy_v<std::decay_t>> 为 true 才参与重载决议
0x03 参数返回值说明
参数 | 说明 |
---|---|
first, last | 要检验的元素范围 |
value | 要与元素比较的值 |
policy | 所用的执行策略。 |
p | 若为要求的元素则返回 true 的一元谓词。 谓词函数签名应等价于如下者: bool pred(const Type &a);签名不必拥有 const & ,但函数必须不修改传递给它的对象。 类型 Type 必须使得 InputIt 类型对象能在解引用后隐式转换到 Type 。 |
q | 若为要求的元素则返回 false 的一元谓词。 谓词函数签名应等价于如下者: bool pred(const Type &a);签名不必拥有 const & ,但函数必须不修改传递给它的对象。 类型 Type 必须使得 InputIt 类型对象能在解引用后隐式转换到 Type 。 |
类型要求
InputIt
必须满足 InputIterator的要求。ForwardIt
必须满足 ForwardIterator 的要求。UnaryPredicate
必须满足 Predicate 的要求
返回值
指向首个满足条件的迭代器,或若找不到这种元素则为 last
。
复杂度
至多应用 last
- first
次谓词。
0x04 可能实现方式
(1) find函数可能实现方式
template<class InputIt, class T>
InputIt find(InputIt first, InputIt last, const T& value)
{
for (; first != last; ++first) {
if (*first == value) {
return first;
}
}
return last;
}
(2) find_if函数可能实现方式
template<class InputIt, class UnaryPredicate>
InputIt find_if(InputIt first, InputIt last, UnaryPredicate p)
{
for (; first != last; ++first) {
if (p(*first)) {
return first;
}
}
return last;
}
(3) find_if_not函数可能实现方式
template<class InputIt, class UnaryPredicate>
InputIt find_if_not(InputIt first, InputIt last, UnaryPredicate q)
{
for (; first != last; ++first) {
if (!q(*first)) {
return first;
}
}
return last;
}
若你没有 C++11 ,则 std::find_if_not 的等价版本是以取反的谓词使用 std::find_if 。
template<class InputIt, class UnaryPredicate>
InputIt find_if_not(InputIt first, InputIt last, UnaryPredicate q)
{
return std::find_if(first, last, std::not1(q));
}
0x05 演示实例
/*********************************************************************************************
* @Copyright (c) , All rights reserved.
* @file: Test.cpp
* @version: ver 1.0
* @author: zbb
* @brief:
* @change:
* @email: binbin_erices@163.com
* Date Version Changed By Changes
* 2020/3/8 13:16 1.0 zbb create
**********************************************************************************************/
#include <iostream>
#include <algorithm>
#include <functional>
#include <vector>
struct Functor
{
public:
bool operator()(int a, int b)
{
return a == b;
}
};
bool isEqual(int x)
{
return x == 5;
}
int main(void)
{
using std::placeholders::_1;
int n1 = 3;
int n2 = 4;
std::vector<int> v{1, 3, 5, 7, 9};
auto result1 = std::find(std::begin(v), std::end(v), n1);
auto result2 = std::find_if(std::begin(v), std::end(v), std::bind(Functor(), n2, _1));
auto result3 = std::find_if(std::begin(v), std::end(v), isEqual);
if (result1 != std::end(v)) {
std::cout << "v contains: " << n1 << '\n';
}
else {
std::cout << "v does not contain: " << n1 << '\n';
}
if (result2 != std::end(v)) {
std::cout << "v contains: " << n2 << '\n';
}
else {
std::cout << "v does not contain: " << n2 << '\n';
}
if (result3 != std::end(v)) {
std::cout << "v contains: " << *result3 << '\n';
}
else {
std::cout << "v does not contain: " << *result3 << '\n';
}
return 0;
}
输出结果:
v contains: 3
v does not contain: 4
v contains: 5