如何使用 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 在给定的对向量中查找元素的主要内容,如果未能解决你的问题,请参考以下文章

c++如何让find_if函数能查找多个符合条件的值?

从向量数组中查找给定向量中公共元素的数量

find_if 中具有多个参数的 Lambda

如何遍历STL映射(查找所有可能的对)

在实例方法中使用 find_if

查找向量中的第一个缺失元素