常用的查找算法
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; }