首页 > 解决方案 > 如何使用 find_if 获取最后一个迭代器?

问题描述

我正在尝试find_if在具有 Lambda 表达式的函数中使用。我想得到向量的最后一个迭代器,但我不知道怎么写。

我可以使用此代码获得第一个迭代器。在这段代码中,struct 有一个索引和分数。代码中的向量保存结构,如果索引是 5 的倍数,则分数比平时要高。在这段代码中,第一个迭代器的索引是 5,最后一个迭代器的索引是 25。

struct Recorder
{
    Recorder(int idx, float score)
    {
        this->idx = idx;
        this->score = score;
    }

    int idx;
    float score;
};

int main(int argc, char** argv)
{

    std::vector<std::shared_ptr<Recorder>> recorders;

    for (int i = 0; i < 30; ++i)
    {
        float score = 0.3;
        bool isLost = false;
        if (i % 5 == 0 && i != 0) score = 0.8;
        std::shared_ptr<Recorder> poseRecord = std::make_shared<Recorder>(i, score);
        recorders.push_back(poseRecord);
    }


    auto record = std::find_if(recorders.begin(), recorders.end(),
        [](const std::shared_ptr<Recorder>& r) {
        return (r->score >= 0.8f);
    });


    std::cout << "idx : " << (*record)->idx << std::endl;
    return 0;
}

如何获得此代码中的最后一次迭代?(这里(*record)->idx应该是 25)。

标签: c++c++11

解决方案


您可以使用反向迭代器从另一端开始搜索。此外,正如 Fureeish 和 Ted 在评论中指出的那样,将共享指针作为引用传递给 lambda 函数会更有效。

auto record = std::find_if(recorders.rbegin(), recorders.rend(),
    [&](const std::shared_ptr<Recorder> & r) {
    return (r->isLost == false && r->score >= 0.8f);
});

推荐阅读