使用 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 迭代器方法会更有效吗?向量将填充到大量,并且需要快速找到。
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()
知道您是否发现了某些东西。
速度而言,这与您的版本之间可能没有(或非常小)差异,但这是一种检查是否找到某些内容的更干净方法。
是的,迭代器将是执行此操作的方法,您实际上是在编写自己的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
现场示例
我对 Lambda 在find_if中有多个参数的双重搜索条件的解决方案
bool check_second_loop(FullFrame *image_track, guint64 object_id, bool *deletion)
{
auto itr= std::find_if(image_track->track_ids.begin(),
image_track->track_ids.end(),
[object_id](const guint64& a)
{
return a == object_id;
});
if (itr != image_track->track_ids.end())
{
image_track->track_ids.erase(itr);
if(image_track->track_ids.size()==0)
{
*deletion = true;
}
return true;
}
else
return false;
}
bool check_first_loop(guint64 object_id, gint source_id)
{
bool deletion = false;
auto it = find_if(full_frame_list.begin(), full_frame_list.end(),
[object_id, &deletion, source_id](FullFrame &x)
{
return check_second_loop(&x, object_id, &deletion)
&& x.camera_number == source_id;
});
if (it != full_frame_list.end())
{
// Found
return true;
}
else
return false;
}