c++之STL(13) STL 算法 - 查找算法(1)

常用的查找算法如下:

find()

find_if()

//

search_n()

search()

find_end()

find_first_of()

adjacent_find()

//

这两种方法通用,对所有容器试用,但是查找效率慢,是线性查找

find() 此复杂度是线性复杂度

find_if() 此复杂度是线性复杂度

注意:

1,如果是已序区间,可以使用  已序区间查找算法(binary_search includes()  lower_bound()  upper_bound())。

2,关联式容器(set multiset map multimap)有等效的成员函数find() , 此find()复杂度是对数复杂度,速度快

3,,string有等效的成员函数find()

//

#include<iostream>
#include<algorithm>
#include<list>

using namespace std;

int main()
{
	list<int> ilist;
	for (int i = 1; i <= 8; i++)
	{
		ilist.insert(ilist.end(), i);
	}
	for (int i = 1; i <= 8; i++)
	{
		ilist.insert(ilist.end(), i);
	}
	for (list<int>::iterator iter = ilist.begin(); iter != ilist.end(); iter++)
	{
		cout << *iter << ' ';
	}
	cout << endl;

	list<int>::iterator pos1;
	pos1 = find(ilist.begin(), ilist.end(), 4);
	list<int>::iterator pos2;
	if (pos1 != ilist.end())
	{
		pos2 = find(++pos1, ilist.end(), 4);
	}
	else
		cout << "没找到 4!" << endl;
	if (pos1 != ilist.end() && pos2 != ilist.end())
	{
		--pos1;
		++pos2;
		for (list<int>::iterator iter = pos1; iter != pos2; iter++)
			cout << *iter;
	}
	cout << endl;

	//
	system("pause");
	return 0;
}
#include<iostream>
#include<algorithm>
#include<vector>
//
#include<functional>

using namespace std;

int main()
{
	vector<int> ivec;
	vector<int>::iterator pos;

	for (int i = 1; i <= 9; i++)
		ivec.push_back(i);
	for (vector<int>::iterator iter = ivec.begin(); iter != ivec.end(); iter++)
		cout << *iter << ' ';
	cout << endl;

	pos = find_if(ivec.begin(), ivec.end(), bind2nd(greater<int>(), 3));	// 函数对象是 > 3

	cout << *pos << endl;

	// modulus  取模运算
	pos = find_if(ivec.begin(), ivec.end(), not1(bind2nd(modulus<int>(), 3)));
	cout << *pos << endl;
	//
	system("pause");
	return 0;
}

//

预定义的函数对象:

negate<type>()    equal_to<type>()     plus<type>()       not_equal_to<type>()       minus<type>()  less<type>()

multiplies<type>()  greater<type>()   divides<type>()  less_equal<type>()  modulus<type>()

greater_equal<type>()  logical_not<type>()  logical_and<type>()  logical_or<type>()

预定义的函数适配器

bindlst(op, value)

bind2nd(op, value)

not1(op)

not2(op)

mem_fun(op)

ptr_fun(op)

已序区间查找算法

binary_search()

includes()

lower_bound()

upper_bound()

#include<iostream>
#include<set>
//
using namespace std;

int main()
{
	// set 自动排序,是自动平衡的高级的红黑树
	set<int> iset;
	iset.insert(43);
	iset.insert(78);
	iset.insert(-1);
	iset.insert(124);

	for (set<int>::iterator iter = iset.begin(); iter != iset.end(); iter++)
		cout << *iter << ' ';
	cout << endl;

	set<int>::iterator pos;
	pos = iset.find(78);	// find  是set  的 成员 函数
	if (pos != iset.end())
	{
		cout << "找到了!" << *pos << endl;
	}
	else
	{
		cout << "没找到!" << endl;
	}
	//
	system("pause");
	return 0;
}
#include<iostream>
#include<string>
//
using namespace std;

int main()
{
	string s("AnnaBelle");
	string::size_type pos = s.find("Belle");

	pos = s.find("bell");
	if (pos != string::npos)
		cout << "找到了!" << pos << endl;
	else
		cout << "没找到!" << endl;
	//
	system("pause");
	return 0;
}
时间: 2024-10-12 09:16:21

c++之STL(13) STL 算法 - 查找算法(1)的相关文章

c++之STL(13) STL 算法 - 查找算法(4)find_first_of(b,e,sb,se) find_first_of(b,e,sb,se,bp)

find_first_of(b,e,sb,se) find_first_of(b,e,sb,se,bp) 使用逆向迭代器 没有find_last_of算法 STL 查找算法 find() find_if() search_n() search() find_end() find_first_of() adjacent_find() string 查找函数和STL查找算法的比较 string函数    STL算法 find()                find() rfind()      

STL (13) 非变动型算法

algorithm是"算法"必须的头文件. Non-modifying sequence operations (非变动式算法):算法过后,容器内部数据不发生改变. all_of Test condition on all elements in range (function template ) any_of Test if any element in range fulfills condition (function template ) none_of Test if no

2. C#数据结构与算法 -- 查找算法(顺序查找,哈希查找,二分查找(折半),索引,二叉)

1. 顺序查找算法 ===================================================== 算法思想简单描述: 最突出的查找类型就是从记录集的开始处顺次遍历每条记录,直到找到所要的记录或者是 到达数据集的末尾.这就是所谓的顺序查找.顺序查找(也被称为线性查找)是非常容易实现 的.从数组的起始处开始,把每个访问到的数组元素依次和所要查找的数值进行比较.如果找 到匹配的数据项,就结束查找操作.如果遍历到数组的末尾仍没有产生匹配,那么就说明此数 值不在数组内. ==

数据结构与算法-查找算法

第二章 查找和排序算法课时1:列表查找1.列表查找的含义:从对象中查找某一个特定的元素2.列表查找的方式包含两种:顺序查找和二分查找3.顺序查找算法:从开始一直搜索到最后一个元素进行查找,for循环,时间复杂度为O(n);4.二分查找针对有效的列表直接进行首尾二分查找,不断使得候选区减半,所以其时间复杂度为O(logn)4.二分查找只针对排序有序的列表查找有效高速,顺序查找针对任何列表:5.由于二分查找算法一般都需要进行排序,而排序算法的时间复杂度一般大于O(n),高于顺序查找:所以在内置的函数

c++之STL(13) STL 算法 - 查找算法(2)

search_n() 用来查找连续的n个匹配的数值 或者 加谓词 search_n(b, e, c, v) search_n(b, e, c, v, p) 注意:该方法的第二种形式应该是search_n_if(b, e, c, p) #include<iostream> #include<algorithm> #include<deque> // #include<functional> // using namespace std; int main()

STL list 使用find_if查找算法

set和multiset map和multimap 有成员函数find函数可快速查找 vector和list 没有find函数想要查找通过迭代器遍历 以下使用类重载运算符实现find_if快速查找: typedef struct strTmpLinkMan { CString TmpLinkManName; CString TmpLinkManeEmail; }strTmpLinkMan; typedef std::list<strTmpLinkMan> TmpLinkMan_t; typed

算法 查找算法--二分查找

二分査找也称折半査找,其优点是查找速度快,缺点是要求所要査找的数据必须是有序序列.该算法的基本思想是将所要査找的序列的中间位置的数据与所要査找的元素进行比较,如果相等,则表示査找成功,否则将以该位置为基准将所要査找的序列分为左右两部分.接下来根据所要査找序列的升降序规律及中间元素与所查找元素的大小关系,来选择所要査找元素可能存在的那部分序列,对其采用同样的方法进行査找,直至能够确定所要查找的元素是否存在,具体的使用方法可通过下面的代码具体了解. 1 #include <stdio.h> 2 b

每天一点算法-查找算法-顺序查找

如何在一个集合中查找一个特定元素,判断其是否存在,最简单的算法循环该集合,从起点开始查找,一个个元素去比对 假设存在集合:int [] a = {1,2,3,4,5,6,7,8,9,10} 条件:查找7在数组a中是否存在 for(int i = 0;i< a.length - 1; i ++) { if(7 == a[i]) {   //存在 } } 此算法的优点是:简单,缺点是当集合大的时候,查找的效率低,从第一个查找到最后一个 原文地址:https://www.cnblogs.com/hpz

数据结构和算法-查找算法-树和二叉树查找

 ######################################################## """ 一.树 1.什么是树? 树状图是一种数据结构,它是由n(n>=1)个有限节点组成一个具有层次关系的集合. 把它叫做“树”是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的. 它具有以下的特点: 每个节点有零个或多个子节点: 没有父节点的节点称为根节点: 每一个非根节点有且只有一个父节点: 除了根节点外,每个子节点可以分为多个不相交的子树: