浅谈STL中的find及其扩展函数

本文深入解析了STL中的find、find_if、find_end和find_first_of四个查找算法的功能与实现,并通过实例展示了它们在不同场景下的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

STL将法库分为4种分别为:非修改式序列操作、修改式序列操作、排序和相关操作、通用数字运算。

前3个在algorithm头文件中描述,而第4个在numeric头文件中描述:

而在非修改式序列操作中,find是一个重要的函数。其STL源码如下:

<span style="font-family:SimSun;font-size:14px;"><span style="font-size:14px;">template<class InputIterator, class T>
  InputIterator find (InputIterator first, InputIterator last, const T& val)
{
  while (first!=last) {
    if (*first==val) return first;
    ++first;
  }
  return last;
}
</span></span>
点击打开链接
从源码中可看到find函数旨在区间[first,last)中循序查找某个值首次出现的位置。其返回值为InputIterator指向满足等同条件的元素,若不成功,则返回迭代器last。

以下是我写的关于find的小程序:

int main(void)
{
	std::string str[] = {"hello","word","wangdao","hehe","lisi","wangdao","hehe"};
	std::string * pstr;
	pstr = std::find(str,str + 7,"word");
	if(pstr != str +7)
		std::cout<<"element found"<<std::endl;
	else
		std::cout<<"element not fount"<<std::endl;
	
	std::deque<std::string> str_deq(str,str + 7);
	std::deque<std::string>::iterator it;
	it = find(str_deq.begin(),str_deq.end(),"word");
	if(it != str_deq.end())
		std::cout<<"element found"<<std::endl;
	else
		std::cout<<"element not fount"<<std::endl;
	std::cout<<*it<<std::endl;

此外,find函数还有很多扩展。

find_if()为在区间中查找第一个满足条件函数的值。和find差不多,只不过第三个参数变成了函数,其中函数的参数为容器中存储的类型,返回值为bool。如果查找失败,find_if返回第二个参数。

bool Ismy(std::string str)
{
	std::string istr = "my";
	return (istr == str);
}<pre name="code" class="cpp">	str_deq.push_back("my");//deque尾插入my
	it = find_if(str_deq.begin(),str_deq.end(),Ismy);
	std::cout<<"the first accord with Ismy is "<<*it<<std::endl;	

 

find_end():在序列中查找最后一个与另一个序列匹配的值。该函数的参数中包含2个序列区间。该函数用于在序列一的[first1,last1)区间内,查完全匹配序列二的[first2,last2)区间的最后一次出现的地方。可以使用容器所存的元素的类型所提供的equality操作,也可以在其参数中加入自己定义的二元运算。

bool equal(std::string str1,std::string str2)
{
	return (str1 == str2);
}

	std::string str2[]= {"wangdao","hehe"};
	it = find_end(str_deq.begin(),str_deq.end(),str2,str2 + 2);
	if(it != str_deq.end())
	{	std::cout<<"str2 last find at "<<(it - str_deq.begin())<<std::endl;
		std::cout<<*it<<std::endl;
	}
	else 
		std::cout<<"fail find_end"<<std::endl;

	it = find_end(str_deq.begin(),str_deq.end(),str2,str2 + 2,equal);
	if(it != str_deq.end())
	{	std::cout<<"str2 last find at "<<(it - str_deq.begin())<<std::endl;
		std::cout<<*it<<std::endl;
	}
	else 
		std::cout<<"fail find_end"<<std::endl;

 find_first_of():与find_end()不同之处在于它是在第二个序列中查找第一个与第一个序列的值匹配的元素。其他的与find_end()相同

	it = find_first_of(str_deq.begin(),str_deq.end(),str2,str2 + 2);
	if(it != str_deq.end())
	{	std::cout<<"str2 first find at "<<(it - str_deq.begin())<<std::endl
		std::cout<<*it<<std::endl;
	}
	else 
		std::cout<<"fail find_end"<<std::endl;

想深入了解以上函数,我还是推荐大家看《STL源码剖析》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值