使用两个条件迭代自定义对象的向量



使用 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;
}

最新更新