
点击蓝字 关注我们

第十八节 查找算法(下)

上一节我们介绍了四种查找函数,分别是find()查找单个指定元素,find_if()查找满足条件的元素,adjacent_find()查找相邻重复元素,binary_search执行二分查找。这节我们继续有关查找的一些函数。
search 用于在序列中搜索子序列的算法。
该函数接受四个迭代器参数,分别是:前两个参数为主序列的迭代器范围,后两个是子序列的迭代器范围。如以下例子:
vector<int>v1 = { 10,20,30,40,50,60 };cout << "v1容器:";for_each(v1.begin(), v1.end(), print);cout << endl;vector<int>v2 = { 20,30,40 };cout << "v2容器:";for_each(v2.begin(), v2.end(), print);cout << endl;auto it = search(v1.begin(), v1.end(), v2.begin(), v2.end());if (it != v1.end()) {cout << "在v1中找到子序列v2" << endl;cout << "它的位置在:" << distance(v1.begin(),it) << endl;}else {cout << "未找到子序列!" << endl;}
search会在主序列 [v1.begin(),v1.end()) 中搜索第一个与子序列 [v2.begin(),v2.end()) 匹配的位置,并返回一个指向此匹配位置的迭代器。如果未找到匹配位置,则返回v1.end()。然后使用distance 函数返回两个迭代器之间的距离。
v1容器:10 20 30 40 50 60v2容器:20 30 40在v1中找到子序列v2它的位置在:1
search_n 用于在序列中搜索连续出现指定数量的指定值。
这个函数接受四个参数:前两个为待查找序列的迭代器范围,第三个参数表示要搜索的特定值的连续出现的次数,第四个参数表示要搜索的特定值。
vector<int>v1 = { 10,20,20,30,40,20,20,20,50,60 };cout << "v1容器:";for_each(v1.begin(), v1.end(), print);cout << endl;auto it = search_n(v1.begin(), v1.end(), 3, 20);if (it != v1.end()) {cout << "在序列中找到3个连续的20!" << endl;cout << "它的位置在:" <<distance(v1.begin(),it) << endl;}else {cout << "未找到3个连续的20!" << endl;}
search_n 会在序列 [v1.begin(),v1.end()) 中搜索连续出现3次值为20 的子序列,并返回一个指向匹配位置的迭代器。如果未找到匹配位置,则返回 v1.end()。
v1容器:10 20 20 30 40 20 20 20 50 60在序列中找到3个连续的20!它的位置在:5
find_first_of用于在序列中搜索另一个序列中的任意一个元素的第一次出现位置。
该函数接受四个迭代器参数,分别是:前两个参数为被查找序列的迭代器范围,后两个是的另一迭代器范围。
vector<int>v1 = { 10,20,30,40,50,60 };cout << "v1容器:";for_each(v1.begin(), v1.end(), print);cout << endl;vector<int>v2 = { 80,70,60,50 };cout << "v2容器:";for_each(v2.begin(), v2.end(), print);cout << endl;auto it = find_first_of(v1.begin(), v1.end(), v2.begin(),v2.end());if (it != v1.end()) {cout << "在序列v1中找到v2中的元素" << endl;cout << "它的位置在:" <<distance(v1.begin(),it) << endl;}else {cout << "未找到元素!" << endl;}
find_first_of 会在序列 [v1.begin(),v1.end()) 中搜索任意一个属于序列 [v2.begin(),v2.end()) 的元素第一次出现位置,并返回一个指向该位置的迭代器。如果未找到匹配位置,则返回 v1.end()。上述例子中找到的元素为50。
v1容器:10 20 30 40 50 60v2容器:80 70 60 50在序列v1中找到v2中的元素它的位置在:4
find_end 用于在序列中搜索另一个序列的最后一次出现位置。
该函数接受四个迭代器参数,分别是:前两个参数为主序列的迭代器范围,后两个是子序列的迭代器范围。
vector<int>v1 = { 10,20,30,40,50,20,30,60 };cout << "v1容器:";for_each(v1.begin(), v1.end(), print);cout << endl;vector<int>v2 = { 20,30 };cout << "v2容器:";for_each(v2.begin(), v2.end(), print);cout << endl;auto it = find_end(v1.begin(), v1.end(), v2.begin(), v2.end());if (it != v1.end()) {cout << "在v1中找到序列v2" << endl;cout << "它最后一次出现的位置在:" << distance(v1.begin(), it) << endl;}else {cout << "未找到子序列!" << endl;}
find_end会在主序列 [v1.begin(),v1.end()) 中搜索最后一个与子序列 [v2.begin(),v2.end()) 匹配的位置(与search相异),并返回一个指向此匹配位置的迭代器。如果未找到匹配位置,则返回v1.end()。
v1容器:10 20 30 40 50 20 30 60v2容器:20 30在v1中找到序列v2它最后一次出现的位置在:5
查找算法的相关操作的讲解到此结束,感谢观看!欢迎各位的点赞与关注!您的点赞和关注是我学习更新的动力!
END
往期推荐
C++高级学习:第十七节-查找算法(上)
C++高级学习:第十六节-count算法
C++高级学习:第十五节-算法概述
C++高级学习:第十四节-multiset&multimap

分享、在看与点赞,至少我要拥有一个吧




