adjacent_find
今天开始,我们正式进入STL算法部分的学习啦~(撒花★,°:.☆( ̄▽ ̄)/$:.°★ 。)
那我们就从adjacent_find
这个长得怪怪的函数开始吧。
先来补习一下英语:
adjacent
adj.
相邻;邻近的;与…毗连的
那么,这个函数的意思便是“邻接查找”(来自百度翻译)
他的功能当然是和他的名字相对应的,是用来查找“容器中[first,last)
范围内第一对相邻的相等的元素(或者说相邻的重复元素)”。当所查找的范围中存在相邻的重复元素时,它能返回第一对重复元素中前一个元素的迭代器;而当范围中不存在符合条件的元素对时,返回last
的值。
嘿嘿,有没有看傻
再概括一点的说:
用于查找范围内相等的相邻元素,并返回到这两个元素中第一个的迭代器,如果没有找到这样的对,则返回
last
的值
如果你还没懂,那就直接来看实例吧......
使用
了解过功能,我们就要把它实践到代码中了,先来看看他的用法:
用法(格式):adjacent_find(范围左端点迭代器,范围右端点迭代器)
可以看到它共有两个参数,分别对应了前面提到的first
和last
。这两个参数均为迭代器,表示所要查找范围的左右端点,需要注意的是,我们查找的范围是一个左闭右开的区间,也就是说,包括first
所对应的元素而不包括last
对应的元素。自然的,当我们对整个容器进行查找时,first
便是.begin()
而last
的值为.end()
即可。
实例:
#include <iostream>
#include <vector>
#include <algorithm>//algorithm头文件是必不可少的
using namespace std;
int main() {
//初始化一个vector类型的容器作为查找的对象
vector<int> vec;
vec.push_back(5);
vec.push_back(2);
vec.push_back(2);
vec.push_back(0);
vec.push_back(0);
//vec = {5, 2, 2, 0, 0}
//定义一个迭代器first(名称不固定,此处便于理解所以命名为first)
vector<int>::iterator first;
//再定义一个迭代器last
vector<int>::iterator last;
//两个迭代器分别对应查找区间的第一个位置和最后一个位置
vector<int>::iterator result;
//定义一个迭代器result存储adjacent_find函数返回的结果
first = vec.begin();
last = vec.end();
//将first对应到容器的开头元素,将last对应到元素的末尾位置
result = adjacent_find(first, last);
//用result存储对整个容器搜索的结果
//此条语句等价于:
result = adjacent_find(vec.begin(), vec.end());
cout << "对整个容器进行搜索的结果为:";
if (result == last) { //如果搜索函数的返回值为搜索区间的末尾迭代器,即last,表明在搜索区间内不存在相等的相邻元素
cout << "Not find." << endl;
} else { //否则表示存在 相等的相邻元素
cout << *result << endl;
//输出result所对应的元素值,即相等的相邻元素中前一个元素的值
//因为vec = {5, 2, 2, 0, 0}
//所以最终的输出是2 (不是0,输出第一对相等的相邻元素)
}
return 0;
}
最终输出:
对整个容器进行搜索的结果为:2
手动实现
adjacent_find
的手动实现还是很简单的~
#include <iostream>
#include <vector>
using namespace std;
vector<int>::iterator Adjacent_find(vector<int>::iterator a, vector<int>::iterator b) { //所有的参数与stl保持一致
while (a != b) { //遍历范围内的每一个元素
if (*a == *(a++)) { //如果该元素与它的下一个元素相等
return a; //返回该元素的位置
}
a++; //查看下一个元素
}
return b; //如果没有搜到,返回末尾位置
}
int main() {
//初始化一个vector类型的容器作为查找的对象
vector<int> vec;
vec.push_back(5);
vec.push_back(2);
vec.push_back(2);
vec.push_back(0);
vec.push_back(0);
//vec = {5, 2, 2, 0, 0}
vector<int>::iterator result;
result = Adjacent_find(vec.begin(), vec.end()); //调用
if (result == vec.end()) {
cout << "Not find." << endl;
} else {
cout << *result << endl;
}
return 0;
}
输出:
2
好啦,这就是adjacent_find
的全部内容了~
点赞!关注!收藏!