C++高级_STL常用的查找算法详解

常用的查找算法

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;
}

 

暂无评论

发表评论