Соответствие алгоритму C ++ CppCheck (std :: find_if вместо необработанного цикла) - PullRequest
2 голосов
/ 01 декабря 2019

CppCheck предлагает мне заменить один из моих кодов алгоритмом STL, я не против, но я не знаю, как его заменить. Я почти уверен, что это плохое предложение (в CppCheck есть предупреждение об экспериментальных функциях).

Вот код:

    /* Cutted beginning of the function ... */

    for ( const auto & program : m_programs )
    {
        if ( program->compare(vertexShader, tesselationControlShader, tesselationEvaluationShader, geometryShader, fragmentShader) )
        {
            TraceInfo(Classname, "A program has been found matching every shaders.");

            return program;
        }
    }

    return nullptr;
} /* End of the function */

И рядом с условием if, которое я получил: "Подумайте об использовании алгоритма std :: find_if вместо необработанного цикла. "

Я пытался использовать его, но больше не могу получить возврат ... Должен ли я игнорировать это предложение?

1 Ответ

2 голосов
/ 01 декабря 2019

Полагаю, вам может понадобиться использовать эту функцию поиска не один раз. Итак, согласно DRY, вам нужно отделить блок, в котором вы вызываете алгоритм std :: find_if, от отдельной функции-оболочки.

{

    // ... function beginning

    auto found = std::find_if(m_programs.cbegin(), m_programs.cend(), 
       [&](const auto& prog)
       {
           bool b = prog->compare(...);
           if (b)
                 TraceInfo(...);
           return b;
       });

    if (found == m_programs.cend())
       return nullptr;

    return *found;

}

Предложение хорошее. Алгоритм STL позволяет выбрать подходящий подход в зависимости от типа вашего контейнера.

Кроме того, я предлагаю вам использовать самобалансирующийся контейнер, такой как std :: set.


// I don't know what kind of a pointer you use. 
using pProgType = std::shared_pointer<ProgType>;

bool compare_progs(const pProgType &a, const pProgType &b)
{
   return std::less(*a, *b);
}

std::set<std::shared_pointer<prog_type>, 
    std::integral_constant<decltype(&compare_progs), &compare_progs>> progs.

Это отсортированный контейнер, поэтому вы будете тратить меньше времени на поиск программы по значению, если вы реализуете оператор сравнения (который вызывается std :: less).

Если вы можете использовать stlфункция, используйте это. Таким образом, вам не нужно будет помнить то, что вы изобрели, потому что stl правильно задокументирован и безопасен в использовании.

...