C ++ CppCheck算法建议(std :: find_if而不是原始循环)相关性

问题描述 投票:0回答:1

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算法而不是原始循环。”

我尝试使用它,但是我无法继续使用退货...我应该忽略这个建议吗?

c++ stl cppcheck
1个回答
1
投票

{

    // ... 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已被正确记录并可以安全使用。

© www.soinside.com 2019 - 2024. All rights reserved.