Как получить последний итератор с помощью find_if? - PullRequest
1 голос
/ 01 июля 2019

Я пытаюсь использовать find_if в функции с лямбда-выражениями. Я хотел бы получить последний итератор вектора, но я не уверен, как его написать.

Я могу получить первый итератор с этим кодом. В этом коде структура имеет индекс и оценку. Вектор в коде сохраняет структуры, и если индекс умножается на пять, оценка выше, чем обычно. В этом коде индекс первого итератора равен пяти, а индекс последнего итератора равен 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).

1 Ответ

4 голосов
/ 01 июля 2019

Вы можете использовать обратные итераторы, чтобы начать поиск с другого конца.Кроме того, как отметили в комментариях Фуреиш и Тед, более эффективно передавать общий указатель на лямбда-функцию в качестве ссылки.

auto record = std::find_if(recorders.rbegin(), recorders.rend(),
    [&](const std::shared_ptr<Recorder> & r) {
    return (r->isLost == false && r->score >= 0.8f);
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...