C++ adjacent_find()函数用法详解
adjacent_find() 函数用于在指定范围内查找 2 个连续相等的元素。该函数的语法格式为:
其中,first 和 last 都为正向迭代器,其组 [first, last) 用于指定该函数的查找范围;pred 用于接收一个包含 2 个参数且返回值类型为 bool 的函数,以实现自定义查找规则。//查找 2 个连续相等的元素
ForwardIterator adjacent_find (ForwardIterator first, ForwardIterator last);
//查找 2 个连续满足 pred 规则的元素
ForwardIterator adjacent_find (ForwardIterator first, ForwardIterator last,
BinaryPredicate pred);
另外,该函数会返回一个正向迭代器,当函数查找成功时,该迭代器指向的是连续相等元素的第 1 个元素;而如果查找失败,该迭代器的指向和 last 迭代器相同。值得一提的是,pred 参数接收的函数既可以定义为普通函数,也可以用函数对象的形式定义。有关谓词函数,读者可阅读《C++谓词函数》一节详细了解。
值得一提的是,adjacent_find() 函数定义于
<algorithm>头文件中,因此使用该函数之前,程序中要先引入此头文件:举个例子:#include <algorithm>
#include <iostream> // std::cout
#include <algorithm> // std::adjacent_find
#include <vector> // std::vector
using namespace std;
//以创建普通函数的形式定义一个查找规则
bool mycomp1(int i, int j) {
return (i == j);
}
//以函数对象的形式定义一个查找规则
class mycomp2{
public:
bool operator()(const int& _Left, const int& _Right){
return (_Left == _Right);
}
};
int main() {
std::vector<int> myvector{ 5,20,5,30,30,20,10,10,20 };
//调用种语法格式
std::vector<int>::iterator it = adjacent_find(myvector.begin(), myvector.end());
if (it != myvector.end()) {
cout << "one : " << *it << '\n';
}
//调用第二种格式,也可以使用 mycomp1
it = adjacent_find(++it, myvector.end(), mycomp2());
if (it != myvector.end()) {
cout << "two : " << *it;
}
return 0;
}
程序执行结果为:
one : 30
two : 10
可以看到,程序中调用了 2 次 adjacent_find() 函数:
第 19 行:使用该函数的种语法格式,查找整个 myvector 容器中连续 2 个相等的元素,显然找到的是 30;
第 25 行:使用该函数的第二种语法格式,查找 {30,20,10,10,20} 部分中是否有连续 2 个符 mycomp2 规则的元素。不过,程序中自定义的 mycomp1 或 mycomp2 查找规则也是查找 2 个连续相等的元素,因此找到的是元素 10。
注意,对于种语法格式的 adjacent_find() 函数,其底层使用的是 == 运算符来判断连续 2 个元素是否相等。这意味着,如果指定区域内的元素类型为自定义的类对象或者结构体变量时,需要先对 == 运算符进行重载,然后才能使用此函数。
C++ STL标准库官方给出了 adjacent_find() 函数底层实现的参考代码,感兴趣的读者可自行分析,这里不再做过多描述:
template <class ForwardIterator>
ForwardIterator adjacent_find (ForwardIterator first, ForwardIterator last)
{
if (first != last)
{
ForwardIterator next=first; ++next;
while (next != last) {
if (*first == *next) // 或者 if (pred(*first,*next)), 对应第二种语法格式
return first;
++first; ++next;
}
}
return last;
}
- 随机文章
- 核心危机(核心危机魔石合成攻略)
- 广州4a广告公司(广州4a广告公司创意总监年薪)
- 抖音卡(抖音卡顿怎么解决)
- xboxones(xboxone手柄怎么配对主机)
- 兵马俑(兵马俑介绍和历史背景)
- 陈武简历
- 帆船比赛(帆船比赛视频)
- 韩国媳妇和小雪(韩国媳妇和小雪的父亲工资是多少)
- 儋州市第二中学(儋州市第二中学录取分数线)
- 鬼泣5攻略(鬼泣5攻略第三关怎么跳)
- 地球日主题(2020年世界地球日主题)
- 和柳亚子(和柳亚子先生于田)
- 国外成人游戏(国外成人游戏注册需要visa信用卡)
- 充值卡代理(充值卡代理加盟)
- 拆奶罩
- 东天目山(东天目山景区)
- 蝙蝠给人类的一封信(蝙蝠给人类的一封信)
- 点对点短信息(点对点短信息费是什么意思)
- 观音普门品(观音普门品念诵全文)
- 河北省大运会(河北省大运会时间)
- 哈利波特官网(哈利波特官网在哪里)
- 骇客神条(骇客神条怎么辨别真假)
- 查传倜(查传倜个人生活)
- 钢筋等级符号(钢筋等级符号电脑怎么输入)
- 常州天宁寺(常州天宁寺求什么灵验)
- 河源巴伐利亚(河源巴伐利亚庄园)
- 广州中山大学(广州中山大学录取分数线2023)
- 风云三国(风云三国2.8作弊指令Ctrl)
- 防水地板(防水复合地板)
- 高智商的电影(高智商的电影排行榜)
