常用的查找算法
adjacent_find: 在iterator对标识元素范围内,查找一对相邻重复元素,找到则返回指向这对元素的第一个元素的迭代器,否则返回 end()。重载版本使用输入的二元操作符代替相等的判断。
binary_search: 在有序序列中查找value,找到返回true。重载的版本实用指定的比较函数对象或函数指针来判断相等。
count: 利用等于操作符,把标志范围内的元素与输入值比较,返回相等元素个数。
count_if: 利用输入的操作符,对标志范围内的元素进行操作,返回结果为true的个数。
equal_range: 功能类似equal,返回一对iterator,第一个表示lower_bound,第二个表示upper_bound。
find: 利用底层元素的等于操作符,对指定范围内的元素与输入值进行比较。当匹配时,结束搜索,返回该元素的一个
adjacent_find()函数
在iterator对标示元素范围内,查找一堆相邻重复元素,找到则返回指向这对元素的第一个元素的迭代器,否在返回 end()
iterator adhacent_find(begin,end);
binary_search()函数
在有序序列中查找 value 找到则返回true。(注意:在无序序列中,不可使用)
bool binary_search(begin, end, calue);
count()函数
利用等于操作符,将使人的数与标志范围内的数比较,返回相等元素的个数
size_t count(begin, end, balue);
ciunt_if() 函数
在查找范围内,自定义的查找规则,返回符合标准的个数
size_t count_if(begin, end, 谓词);
find()函数
查找范围内指定元素
查找成功返回该元素的迭代器
失败返回end()
iterator find(begin, end, value);
find_if()函数
查找范围内指定条件的元素
成功返回该元素迭代器
失败返回 end()
iterator find_if(begin, end, 谓词);
下面是我写的以上几个函数的练习演示代码:
#include <iostream>
#include <algorithm>
#include <vector>
#include <functional>
using namespace std;
void test_adjacent_find()
{
vector<int> vec;
vec.push_back(1);
vec.push_back(3);
vec.push_back(5);
vec.push_back(6);
vec.push_back(3);
//找到容器中 相邻的重复元素的 第一个元素的迭代器
vector<int>::iterator it = adjacent_find(vec.begin(), vec.end());
if (it != vec.end()) {
cout << *it << endl;
}
}
void test_binary_search()
{
vector<int> vec;
vec.push_back(1);
vec.push_back(3);
vec.push_back(5);
vec.push_back(6);
vec.push_back(3);
vec.push_back(3);
vec.push_back(17);
vec.push_back(9);
vec.push_back(8);
//先排序
sort(vec.begin(), vec.end(), less<int>());
//查找17 是否在vec中
if (binary_search(vec.begin(), vec.end(), 17) == true) {
cout << "找到了17" << endl;
}
else {
cout << "未找到" << endl;
}
}
class Great3
{
public:
bool operator()(int &value)
{
return (value > 3);
}
};
void test_conut_if()
{
vector<int> vec;
vec.push_back(1);
vec.push_back(3);
vec.push_back(5);
vec.push_back(6);
vec.push_back(3);
vec.push_back(3);
vec.push_back(17);
vec.push_back(9);
vec.push_back(8);
//int cnt = count_if(vec.begin(), vec.end(), Great3());
int cnt = count_if(vec.begin(), vec.end(), bind2nd(greater<int>() , 3) );
cout << "cnt " << cnt << endl;
}
void test_find()
{
vector<int> vec;
vec.push_back(1);
vec.push_back(3);
vec.push_back(5);
vec.push_back(6);
vec.push_back(3);
vec.push_back(3);
vec.push_back(17);
vec.push_back(9);
vec.push_back(8);
//找到所有的3
vector<int>::iterator it = find(vec.begin(), vec.end(), 3);
while (it != vec.end()) {
cout << "找到了3" << endl;
it++;
if (it != vec.end())
{
it = find(it, vec.end(), 3);
}
}
cout << " ---- " << endl;
//找到所有小于等于3的元素
it = find_if(vec.begin(), vec.end(), not1(bind2nd(greater<int>(), 3)));
while (it != vec.end()) {
cout << "找到了 " << *it << endl;
it++;
if (it != vec.end()) {
it = find_if(it, vec.end(), not1(bind2nd(greater<int>(), 3)));
}
}
}
int main(void)
{
//test_adjacent_find();
// test_binary_search();
//test_conut_if();
test_find();
return 0;
}