STL_02: find/find_if/find_if_not函数

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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Erice_s

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值