在find_if中具有多个参数的Lambda

时间:2018-03-28 10:06:14

标签: c++ algorithm c++11 lambda find

我有一个包含自定义数据类型对象的向量。此数据类型的一个字段是枚举。我想确保对于所有枚举值,向量中添加至少一个条目。

我想使用std::find_if()检查向量是否有某个枚举值的条目。但我不确定怎么写&正确使用lambda。这就是我得到的:

struct CustomType
{
  EnumType type {EnumType::DEFAULT};
  int x;
};

std::vector<CustomType> tmp;

// fetch values from database and add them to the vector
// for some EnumType values there might not be a record added to the vector

auto hasEnumType = [](const CustomType& customType, const EnumType& enumType) -> bool
{
  return (customType.type == enumType);
};

// What do I replace '?' with to get the current position
if (std::find_if(tmp.begin(), tmp.end(), hasEnumType(?, EnumType::VALUE1)) != tmp.end())
{
  //add CustomType with VALUE1 to vector
}

2 个答案:

答案 0 :(得分:1)

如果要检查固定值,可以简单地将其放在lambda中。

if ( std::find_if(tmp.begin(), tmp.end(), [](CustomType const & customType)
                  { return customType.type == EnumType::VALUE; }) )
{ /* do something */}

如果你想在某种意义上将它传递给lambda作为参数,你可以在一个外部变量中设置它并且&#34;捕获&#34;以引用方式

auto enumType = EnumType::VALUE;

// capture variables by references --------V
if ( std::find_if(tmp.begin(), tmp.end(), [&](CustomType const & customType)
                  { return customType.type == enumType; }) )
{ /* do something */ }

答案 1 :(得分:0)

std::find_if将一元谓词作为其第三个参数。如果你提供二元谓词,它将失败类型检查。

执行此操作的一种方法是通过捕获其中一个参数将二进制谓词转换为一元谓词。要为所有enum值自动化,请创建一个返回另一个函数的函数。

auto getTypeChecker = [](const EnumType enumType)
{
    return [enumType](const CustomType& customType)
    {
        return (customType.type == enumType);
    };
};

然后声明一个函数,负责插入向量中不存在的枚举值 -

void insert_if_not_present(std::vector<CustomType>& vec, const EnumType type)
{
    if(std::none_of(begin(vec), end(vec), getTypeChecker(type)))
    {
        //add CustomType with type to vec
    }
}

现在为每个枚举值调用insert_if_not_present一次。

注意,为方便起见,我使用了std::none_of。您可以使用std::find_if代替std::none_of