std::find_first_of 用法

描述:
       寻找两个容器中出现相同元素的首个位置。
       用 operator== 比较元素。

定义:

template< class ForwardIt1, class ForwardIt2 >
ForwardIt1 find_first_of( ForwardIt1 first, ForwardIt1 last,
                          ForwardIt2 s_first, ForwardIt2 s_last );

template< class InputIt, class ForwardIt >
InputIt find_first_of( InputIt first, InputIt last,
                       ForwardIt s_first, ForwardIt s_last );
                       
template< class InputIt, class ForwardIt >
constexpr InputIt find_first_of( InputIt first, InputIt last,
                                 ForwardIt s_first, ForwardIt s_last );
template< class ForwardIt1, class ForwardIt2, class BinaryPredicate >
ForwardIt1 find_first_of( ForwardIt1 first, ForwardIt1 last,
                          ForwardIt2 s_first, ForwardIt2 s_last, BinaryPredicate p );
                          
template< class InputIt, class ForwardIt, class BinaryPredicate >
InputIt find_first_of( InputIt first, InputIt last,
                       ForwardIt s_first, ForwardIt s_last, BinaryPredicate p );

template< class InputIt, class ForwardIt, class BinaryPredicate >
constexpr InputIt find_first_of( InputIt first, InputIt last,
                                 ForwardIt s_first, ForwardIt s_last, BinaryPredicate p );

可能的实现

template<class InputIt, class ForwardIt>
InputIt find_first_of(InputIt first, InputIt last,
                      ForwardIt s_first, ForwardIt s_last)
{
    for (; first != last; ++first) {
        for (ForwardIt it = s_first; it != s_last; ++it) {
            if (*first == *it) {
                return first;
            }
        }
    }
    return last;
}
template<class InputIt, class ForwardIt, class BinaryPredicate>
InputIt find_first_of(InputIt first, InputIt last,
                      ForwardIt s_first, ForwardIt s_last,
                      BinaryPredicate p)
{
    for (; first != last; ++first) {
        for (ForwardIt it = s_first; it != s_last; ++it) {
            if (p(*first, *it)) {
                return first;
            }
        }
    }
    return last;
}

参数:
       first, last - 要检验的元素范围
       s_first, s_last - 要搜索的元素范围
       p - 若元素应被当做相等则返回 ​true 的二元谓词。

返回值:
       返回范围 [first, last) 中等于来自范围 [s_first; s_last) 中一个元素的首个元素。若找不到这种元素,则返回 last 。

示例:

#include <iostream>
#include <vector>
#include <algorithm>

int main()
{
	std::vector<int> v = {1,2,3,4,5};
	std::vector<int> v2 = { 6,7,2,8 };

	auto iter = std::find_first_of(v.begin(), v.end(), v2.begin(), v2.end());
	if (iter == v.end())
		std::cout << "不存在相同元素" << std::endl;
	else
		std::cout << "存在相同元素,元素索引为:" << std::distance(v.begin(), iter) << std::endl;
	//存在相同元素,元素下标为:1
}
#include <iostream>
#include <vector>
#include <algorithm>

struct SData
{
	int m_nData;
	double m_dData;

	SData(int nData, double dData)
		:m_nData(nData), m_dData(dData)
	{
	}
};

int main()
{
	std::vector<SData> v;
	for (int i = 0; i < 5; i++)
	{
		v.push_back(SData(i,i));
	}
	std::vector<SData> v2;
	v2.push_back(SData(8,8));
	v2.push_back(SData(3,3));

	//使用lambda表达式指定条件(一般用于自定义元素)
	auto iter = std::find_first_of(v.begin(), v.end(), v2.begin(), v2.end(), [](const SData& data1,const SData& data2) 
	{
		return data1.m_nData == data2.m_nData;
	});
	if (iter == v.end())
		std::cout << "不存在相同元素" << std::endl;
	else
		std::cout << "存在相同元素,元素索引为:" << std::distance(v.begin(), iter) << std::endl;
	//存在相同元素,元素下标为:3
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值