STL中search相关算法
纳兰性德《减字木兰花·相逢不语》
相逢不语,一朵芙蓉著秋雨。小晕红潮,斜溜鬟心只凤翘。
待将低唤,直为凝情恐人见。欲诉幽怀,转过回阑叩玉钗。
💢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