使用两个条件

时间:2017-01-04 15:08:05

标签: c++ c++11 vector stl

使用C ++ 11,我想迭代一个向量并返回一个表明未找到索引的类型。

我习惯于传统的for(;;)循环并手动指定索引,我的代码如下所示。

inline std::size_t ItemList::FindItem(Items& Item)
{
    for (std::size_t i = 0; i < ItemVector.size(); i++)
    {
        if (ItemVector[i]->GetId() == Item.GetId() && !ItemVector[i]->GetName().compare(Item.GetName()))
        {
            return i + 1;
        }

    }
    return 0;
}

我还必须递增索引+1以便返回值0(以容纳无符号size_t)以指示未找到索引的调用方法(我知道这是asinine)。我假设它更适合返回更像std::end()的内容?

使用C ++ 11迭代器方法会更有效吗?矢量将填充到一个大数字,并且查找需要很快。

2 个答案:

答案 0 :(得分:5)

您可以使用std::find_if并使用迭代器:

auto it = std::find_if(ItemVector.begin(), ItemVector.end(), 
    [&Item](Items *value) {
        return value->GetId() == Item.GetId() && !value->GetName().compare(Item.GetName());
    }
);

然后你可以简单地测试it != ItemVector.end()是否知道你是否找到了什么。

在速度方面,这个和你的版本之间可能没有(或非常小)的区别,但它是一种更清晰的方法来检查是否找到了某些东西。

答案 1 :(得分:1)

是的,迭代器将是这样做的方式,你实际上是在编写自己的find_if版本而你可以这样做:

find_if(cbegin(ItemVector), cend(ItemVector), [&](const auto& i){ return i.GetId() == Item.GetId() && i.GetName() != Item.GetName(); })

您可以通过测试与cend(ItemVector)的相等性来测试是否找到了此函数的结果。

此外,如果您需要找到项目的索引,可以在cbegin(ItemVector)之后将此结果传递给:distance

Live Example