使用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迭代器方法会更有效吗?该向量将被填充到大量,并且查找需要快速。
发布于 2017-01-04 15:13:08
您可以使用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()是否找到了什么。
这和你的版本在速度上可能没有(或很小)的差别,但它是一种更干净的方法来检查是否找到了什么东西。
发布于 2022-08-20 09:58:20
find_if中Lambda具有多个参数的双搜索条件的求解
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;
}https://stackoverflow.com/questions/41467029
复制相似问题