如何使用find_if在pair类型vector中查找元素并向比较器传参
解决方案
以下是两种常用的实现方案,可根据你的编译器支持的C++标准选择:
方式1:使用Lambda表达式(C++11及以上,推荐)
这是目前最简洁的实现方式,直接通过Lambda捕获外部输入的字符串s即可:
#include <algorithm> #include <vector> #include <string> #include <utility> using namespace std; // 你的原有逻辑 string s; cin >> s; // 直接在find_if参数中定义Lambda作为比较器 if (find_if(vec.begin(), vec.begin() + 3, [&s](const pair<string, int>& elem) { // 比较pair的第一个成员(存储的字符串)是否等于目标s return elem.first == s; }) != vec.begin() + 3) { // 前3个元素中存在匹配的字符串 }
逻辑说明:
[&s]表示按引用捕获外部变量s,Lambda内部可以直接访问这个输入的字符串- Lambda的入参是
vector存储的pair<string, int>类型的常量引用,避免不必要的拷贝开销 - 返回值为
bool,当元素的字符串成员和目标s相等时返回true,find_if会停止遍历返回当前迭代器
方式2:使用仿函数(函数对象,兼容C++03及更早标准)
如果需要兼容旧版C++标准,可以自定义仿函数类传递目标字符串:
第一步:定义仿函数
#include <string> #include <utility> using namespace std; struct MatchString { const string& target; // 构造函数接收目标字符串并存储 MatchString(const string& s) : target(s) {} // 重载()运算符实现比较逻辑 bool operator()(const pair<string, int>& elem) const { return elem.first == target; } };
第二步:调用find_if时传入仿函数实例
string s; cin >> s; if (find_if(vec.begin(), vec.begin() + 3, MatchString(s)) != vec.begin() + 3) { // 匹配到目标字符串 }
内容的提问来源于stack exchange,提问作者matrix
相关产品推荐
相关产品推荐

