目录
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;
}
二、二分查找
( 后三个函数,对于 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;
}