如何使用 find_if 在给定的对向量中查找元素
Posted
技术标签:
【中文标题】如何使用 find_if 在给定的对向量中查找元素【英文标题】:how to use find_if to find element in given vector of pairs 【发布时间】:2021-12-24 04:46:38 【问题描述】:例如考虑vector<pair<string,int>>
它包含:
ABC 1 BCD 2 CDE 3 XHZ 4
string s;
cin>>s;
if(find_if(vec.begin(),vec.begin()+3,cmp)!=vec.begin()+3) // I want to check only first 3 values
我需要 cmp 来使用 find_if 查找给定的字符串是否存在
编辑: 如何使用比较器(cmp)传递字符串 s 并且向量将始终包含至少 3 个元素
【问题讨论】:
将vec.begin()+3
替换为vec.end()
。您的 cmp
lambda 可能看起来像 auto cmp = [](const std::pair<std::string, int> pair) return pair.first == myString;
@Mansoor 有点隐藏是一个评论,提到向量的 end()
是不需要的。应该只搜索前 3 个元素,我想可以确保某处至少有 3 个元素。
【参考方案1】:
最简单的方法是使用 lambda 表达式。例如
#include <string>
#include <utility>
#include <vector>
#include <iterator>
#include <algorithm>
//...
std::string s;
std::cin >> s;
auto cmp = [&s]( const auto &p ) return p.first == s; ;
if ( std::find_if( std::begin( vec ), std::next( std::begin( vec ), 3 ), cmp ) != std::next( std::begin( vec ), 3 ) )
//...
另一种方法是在 main 之前创建一个函数对象,例如
class cmp
public:
cmp( const std::string &s ) : s( s )
bool operator() ( const std::pair<std::string, int> &p ) const
return p.first == s;
private:
const std::string &s;
;
//...
if ( std::find_if( std::begin( vec ), std::next( std::begin( vec ), 3 ), cmp( s ) ) != std::next( std::begin( vec ), 3 ) )
//...
【讨论】:
抱歉,您能否在不使用 lambda 的情况下发送此代码。 @matrix 使用仿函数。如果 cmp 是一个函数,我认为除非您将 s 设为全局变量,否则您将不走运 @matrix 可以使用函数对象。 是的@CaptainHatteras。如果我不打算使用 lambda ,我想剩下的唯一选择就是使用 functor。 好的@VladfromMoscow以上是关于如何使用 find_if 在给定的对向量中查找元素的主要内容,如果未能解决你的问题,请参考以下文章