C++系列-STL中搜索相关算法


纳兰性德《减字木兰花·相逢不语》
相逢不语,一朵芙蓉著秋雨。小晕红潮,斜溜鬟心只凤翘。
待将低唤,直为凝情恐人见。欲诉幽怀,转过回阑叩玉钗。


💢search相关算法

算法 描述
search(beg1, end1, beg2, end2) 在[beg1, end1) 范围内查找[beg2, end2)首次出现,查找成功,返回[beg1, end1)内第一次出现[beg2, end2)的位置,查找失败返回end1
search(beg1, end1, beg2, end2, pred) 使用pred代替==操作符执行search()
search_n(beg, end, n, val) 在[beg, end)范围内查找val出现n次的字序列
search_n(beg, end, n, val, pred) 使用pred代替==操作符执行search_n()
binary_search(beg, end, val) 使用二分法在[beg, end)范围内查找val,速度非常快。要求序列是有序的,否则结果未知,查找到后返回true,否则false
binary_search(beg, end, val, pred) 使用pred代替==操作符执行binary_search()
lower_bound(beg, end, val) 在[beg1, end1) 范围内查找第一个不小于val(>=val)的元素的迭代器,查找到后返回该元素的迭代器,否则返回序列的end(),因为内部是二分法实现的,需要保证是有序序列
lower_bound(beg, end, val,pred) 查找第一个不满足pred的元素对应的迭代器
upper_bound(beg, end, val) 在[beg1, end1) 范围内查找第一个大于val的元素的迭代器,查找到后返回该元素的迭代器,否则返回序列的end(),,因为内部是二分法实现的,需要保证是有序序列

💢💢search算法举例

👉 👉 👉
在下面的代码中,search(vec1.begin(), vec1.end(), vec2.begin(), vec2.end()),当在vec1{1, 33, 44, 2, 5, 55, 25, 44, 2, 7}中找到vec2{44, 2}时返回,在vec1中,有两处44,2子序列,只返回vec1中第一个44对应的迭代器。
search(vec1.begin(), vec1.end(), vec2.begin(), vec2.end(), [](int val1, int val2) -> bool {return val2 > val1;},在vec1{1, 33, 23, 2, 5, 55, 25, 44, 2, 7}中,寻找连续的子序列,对应的元素分别小于vec2{44, 5}中的44,5,vec1中的23,2分别小于44,5,故返回vec1中23所对应的迭代器。

code:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

template<typename T>
void print_vector(const vector<T>& vec)
{
   
	for (auto i_vec : vec)
	{
   
		cout << i_vec << " ";
	}
	cout << endl;
}

void test01()
{
   
	vector<int> vec1 {
   1, 33, 44, 2, 5, 55, 25, 44, 2, 7};
	vector<int> vec2 {
   44, 2};
	vector<int>::iterator it = search(vec1.begin(), vec1.end(), vec2.begin(), vec2.end());
	if (it != vec1.end())
	{
   
		vector<int> vec3;
		vec3.assign(it, vec1.end());
		print_vector(vec3);
	}
	else
	{
   
		cout << "没找到" << endl;
	}
}

void test02()
{
   
	vector<int> vec1 {
   1, 33, 23, 2, 5, 55, 25, 44, 2, 7};
	vector<int> vec2 {
   44, 5};
	// vec2中是一个整体,vec1从头开始搜索,当发现连续的元素满足和vec2的关系时,停止搜索
	vector<int>::iterator it = search(vec1.begin(), vec1.end(), vec2.begin(), vec2.end(), [](int val1, int val2) -> bool {
   return val2 > val1;});
	if (it != vec1.end())
	{
   
		vector<int> vec3;
		vec3.assign(it, vec1.end());
		print_vector(vec3);
	}
	else
	{
   
		cout << "没找到" << endl;
	}
}
void main()
{
   
	test01();
	test02();
	system("pause");
}

result:
44 2 5 55 25 44 2 7
23 2 5 55 25 44 2 7

💢💢search_n算法举例

👉 👉 👉
在下面的代码中,search_n(vec1.begin(), vec1.end(), 2, 5),在vec1 {1, 33, 44, 2, 5, 5, 25, 44, 2, 7}中搜索连续的2个5,返回第一个5对应的迭代器。
search_n(vec1.begin(), vec1.end(), 3, 5, [](int val1, int val2) -> bool {return val1 > val2;}),在谓词中,第1个参数val1是vec1中的元素,第2个参数val2是5。
在vec1{1, 33, 23, 2, 18, 55, 25, 44, 2, 7}中搜索,连续3个元素满足分别大于5,18, 55, 25满足条件,则返回第一个元素18对应的迭代器。

code:
#include <iostream>
#include 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值