STL的8个查找算法

目录

一、线性查找( “使用代码” 在下面 )

1、find  ( iter  ator  begin, iterstor  end,  value ) 

2、find_if     ( begin, end, _callback);

3、adjacent_find  ( begin, end, _callback );

4、count       ( begin, end, value );       

5、count_if  ( begin,  end,  _callback )

二、二分查找  

1、binary_search   ( begin,  end, value );  

2、 lower_bound   ( begin,  end, value );  

3、upper_bound   ( begin,  end,  value );    

4、equal_range ( begin,  end,  value )


 

一、线性查找( “使用代码” 在下面 )

1、find  ( iterator  begin, iterstor  end,  value ) 

 按值 查找 元素   (不能查找 指针,无意义 )

 返回值 :成功:查找元素 的位置(迭代器)

                失败:结束迭代器位置 : .end()

参1:起始迭代器

参2:结束迭代器

参3:要查找 的值

2、find_if     ( begin, end, _callback);

按条件 查找元素(如:自定义类型、结构体)

返回值 :成功:查找元素 的位置(迭代器)

               失败:结束迭代器位置 : .end()

参1:起始迭代器

参2:结束迭代器

参3:回调函数 或 STL的内建 仿函数

3、adjacent_find  ( begin, end, _callback );

在指定范围内,从左往右查找 相邻 且重复 的元素:( 返回 第一对的第一个元素迭代器) 

返回值 :成功:第一对相邻重复 的第一个元素 的迭代器

               失败:结束迭代器 : .end()

1)参1:起始迭代器

2)参2:结束迭代器

3)参3:回调函数 或 STL的内建 仿函数

4、count       ( begin, end, value );       

统计 “指定元素”的个数,返回一个int 值

        ( 是 set、map 容器的 内置函数)

1)参1:起始迭代器         

2)参2:结束迭代器

3)参3:要查找 的值

5、count_if  ( begin,  end,  _callback )

按条件 统计“指定元素”的个数,返回一个int 值

1)参1:起始迭代器

2)参2:结束迭代器

3)参3:回调函数 或 STL的内建 仿函数 

//回调函数 : 普通函数 形式
bool CompAdj(int val, int val2)
{					 // adjacent_find( ) 使用
	return val == val2; 
}
bool CompFind(int val)//find()、count() 使用
{					
	return val == 2; 
}
//回调函数 : 函数对象 形式
class CompAdj2 	//adjacent_find( ) 使用
{		
public:
	bool operator() (const int& val,const int&val2)
	{
		return val == val2;
	}
};
class CompFind2 // find()、count() 使用
{		  
public:
	bool operator() ( const int& val)
	{
		return val == 2;	
	}
};
int main()
{ /* set容器不能插入重复值,count()返回只有1或0(用于判断一个元素 是否存在)
	multiset 才能插入重复值,才是判断个数。
	count( ) 对于 set、map 是内置函数  */

	vector<int>v{ 1,4,3,3,2,2,3 };
	int arr[10] = { 1,4,3,3,2,2,3 };  
	multiset<int>s{ 1,4,3,3,2,2,3 };

	  vector<int>::iterator Pos;
			 int Pos2= 0, Pos3 = 0;
	multiset<int>::iterator Pos4;
	int* Parr;
	int Count = 0, Count2 = 0; 

//1、find( ) : 查找元素,返回一个迭代器
	 Pos  = find(v.begin(), v.end(), 1); // 迭代器
	 Pos2 = Pos - v.begin();			 //得到 vector下标( 从0开始存储的,要减掉一个位置)

	 Pos3 = find(arr, arr + 7, 2) - arr; //得到 数组下标

	 cout << *Pos << v[Pos2] << arr[Pos3] << endl;

//2、find_if( ) : 按条件 查找元素,返回一个迭代器
  //例1: 使用 回调函数  (普通函数形式 和 类函数对象形式)
	Pos  = find_if(v.begin(), v.end(), CompFind);
	Parr = find_if(arr, arr + 7, CompFind2());

  //例2: 使用  lanmda表达式:[]( 形参 ){ 实现 }
	Pos  = find_if(v.begin(), v.end(), [](int val) { return val == 1; });
	Parr = find_if( arr, arr + 7,      [](int val) { return val == 2; }); 

	cout << *Pos << *Parr << endl;

//3、adjacent_find( ) : 从左往右查找,返回第一个重复 且相邻的 元素
  //例1:只写2个参数
	Pos  = adjacent_find(v.begin(), v.end());
	Parr = adjacent_find(arr, arr+7);

	if (Pos != v.end()) cout << *Pos;
	if (Parr != arr + 7)  cout << *Parr << endl;

  //例2:写3个参数  // 使用 回调函数 
	Pos  = adjacent_find(v.begin(), v.end(), CompAdj);// 普通函数 方式
	Parr = adjacent_find(arr, arr + 7, CompAdj2());	  // 函数对象 方式

	if (Pos  != v.end())  cout << *Pos ;
	if (Parr != arr + 7)  cout << *Parr << endl;

//4、count( ) : 统计“指定元素”个数,返回一个 int值
	 Count  = count(v.begin(), v.end(), 1);
	 Count2 = s.count(2); //对于 set、map 容器,是内置函数。

	 cout << Count  << Count2 << endl;

//5、count_if( ) : 按条件 统计元素个数
   //例1:参3,使用回调函数 
	 Count = count_if(v.begin(), v.end(), CompFind);
	 Count2 = count_if(arr, arr + 7, CompFind2());

   //例2:参3 使用lanmda表达式
	 Count  = count_if(v.begin(), v.end(), [](int val) { return val == 2; });
	 Count2 = count_if( arr, arr + 7,  [](int val) { return val == 2; });
	 
	 cout << Count  << Count2 << endl;
	return 0;
}

4862dfdf716c43658c650f85af1bc45c.png

 

二、二分查找  

( 后三个函数,对于 set、map 容器,是内置函数,当然也可以和普通函数 一样对待 )

1、binary_search   ( begin,  end, value );  

查找 某个值 是否存在,返回 : true / false

  1)参1 :起始迭代器

  2)参2 :结束迭代器 ( 对于数组 :是尾元素的下一个位置)

  3)参3 :要查找的 值

2、 lower_bound   ( begin,  end, value );  

查找 第一个 >= value,的元素,返回 其迭代器

  1)参1 :起始迭代器

  2)参2 :结束迭代器 ( 对于数组 :是尾元素的下一个位置)

  3)参3 :要查找的 值

 

3、upper_bound   ( begin,  end,  value );    

查找 第一个 > value 的元素,返回 其迭代器

   1)参1 :起始迭代器

   2)参2 :结束迭代器 ( 对于数组 :是尾元素的下一个位置)

   3)参3 :要查找的值

 

4、equal_range ( begin,  end,  value )

 可看做  lower_bound( )  和  upper_bound( ) 的结合,

 返回一个pair对象( 包含两个迭代器,构成一个范围,第一个: >= val的 .first, 第二个: > val的 .second )

  1)参1 :起始迭代器

  2)参2 :结束迭代器 ( 对于数组 :是尾元素的下一个位置)

  3)参3 :要查找的值

#include<algorithm> //所需 头文件
int main()                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   
{
	vector<int>v{ 5,6,7,8,9,0,1,2,3,4 };
	   set<int>s{ 0,1,2,3,4,5,6,7,8,9 };
  int arr[10] = { 5,6,7,8,9,0,1,2,3,4 };
	   
	sort(v.begin(), v.end());
	sort(arr, arr + 10); //二分查找 只能用于有序序列!若无序 结果未知!
	
	bool ret, ret2, ret3;
	vector<int>::iterator Pos; 
	   set<int>::iterator Pos2;
		   int Pos3 = 0;
	
//1、binary_searc( ) : 查找 某个值是否存在,返回:TRUE/FALSE
	ret  = binary_search(v.begin(), v.end(),2);
	ret2 = binary_search(s.begin(), s.end(), 3); 
	ret3 = binary_search(arr, arr + 9, 4);

	if (ret)	cout << "找到了2" << endl;
	if (ret2)	cout << "找到了3" << endl;
	if (ret3)	cout << "找到了4" << endl;
	
//2、lower_bound( ) : 返回 第一个>=val,的位置(迭代器)
	Pos  = lower_bound(v.begin(), v.end(), 2);  
	
	Pos2 = s.lower_bound(3); //对于set、map 容器: 是内置函数,当然也可以写“3个参数”的格式
	Pos2 = lower_bound(s.begin(), s.end(), 3);

	Pos3 = lower_bound(arr, arr + 9, 4) - arr; //对于数组: 要减去首地址,才得到地址

	cout << *Pos << ' ' << *Pos2 << ' ' << arr[Pos3] << endl;

//3、upper_bound( ): 返回 第一个 >val的位置(迭代器)
	Pos  = upper_bound(v.begin(), v.end(), 2);

	Pos2 = s.upper_bound(3); //也是set、map的内置函数
	Pos2 = upper_bound(s.begin(), s.end(), 3);

	Pos3 = upper_bound(arr, arr + 9, 4) - arr;
	cout << *Pos << ' ' << *Pos2 << ' ' << arr[Pos3] << endl << endl;

/*4、equal_range( ) :可看做lower_bound( )和upper_bound( )的结合,返回一个pair对象
     (包含两个迭代器,构成一个范围,第一个:>=val的.first,第二个:>val的.second )*/
	pair<vector<int>::iterator, vector<int>::iterator> result;
	   pair<set<int>::iterator, set<int>::iterator> result2;
	pair<int*, int*> result3;  // 址传递
   //pair<int, int>  result3;  // 数组 : 值传递 错误!:非法的间接寻址!

	result  = equal_range(v.begin(), v.end(), 2);

	result2 =s.equal_range(3); //也是set、map的内置函数
	result2 = equal_range(s.begin(), s.end(), 3);

	result3 = equal_range(arr, arr + 9, 4);

	auto result4 = equal_range(arr, arr + 9, 5);   
/*
使用auto 简化,初始化“pair对象”(auto声明变量 的同时,必须初始化)*/

  //注: 对返回的 pair对象的两个变量的使用:
	cout << *result.first  << *result.second  << endl;
	cout << *result2.first << *result2.second << endl;
	cout << *result3.first << *result3.second << endl;
	cout << *result4.first << *result4.second << endl;

/*5、对于查找 < 或 > value的个数:(因为只用于 有序序列)
   1)故 < 时: lower_bound() 是返回 >=val的第一个,而不是 <Key的第一个
	如 :从小到大序列 :>= 肯定优先找到 =val的,没有再找 >key的,即之前的元素都是 <val的
   2)故 > 时: upper_bound()返回 >val的第一个,即包括此元素 之后的都是 >val的 
*/
	return 0;
}

 7fba53d7042f440e8e2bdbf68cbe03bd.png

 

 

 

 

 

 

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

C_JJ_C

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

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

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

打赏作者

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

抵扣说明:

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

余额充值