使用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迭代器方法会更有效吗?矢量将填充到一个大数字,并且查找需要很快。
答案 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)