将函数转换为find_if lambda

时间:2017-05-08 22:14:35

标签: c++

将函数转换为std :: find_if lamnda时遇到一些麻烦。 下面你可以看到我的功能

bool Room::ItemInRoomPresent(std::string & item)
{
    bool isPresent = false;
    for (std::vector<Item>::iterator i = m_RoomItems.begin(); i !=m_RoomItems.end(); i++)
    {
        if (i->GetName() == item)
        {
            item == i->GetName();
            isPresent = true;
            break;
        }
    }
    return isPresent;
}

有人可以帮助我吗?

2 个答案:

答案 0 :(得分:2)

像这样:

auto it = std::find_if(m_RoomItems.begin(), m_RoomItems.end(),
                       [&](const Item& x) { return x.GetName() == item; });

return it != m_RoomItems.end();

item == i->GetName();语句中的语句if无效,所以我省略了它。)

答案 1 :(得分:2)

如评论中所述,如果您对找到某个项目的位置不感兴趣,只需在序列中的任何位置至少有一个匹配项目,您可以使用std::any_of和使这基本上是一个单行:

return std::any_of(m_RoomItems.begin(), 
                   m_RoomItems.end(),
                   [&](Item const& x) { return x.GetName() == item; });

传递的lambda与Kerrek的版本相同,但返回值可以直接使用。