C++ CppCheck算法建议(std::find_if代替原始循环)相关性

Posted

技术标签:

【中文标题】C++ CppCheck算法建议(std::find_if代替原始循环)相关性【英文标题】:C++ CppCheck algorithm suggestion (std::find_if instead of raw loop) pertinence 【发布时间】:2019-12-01 13:14:49 【问题描述】:

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】:

我想您可能不需要使用该查找功能一次。因此,根据 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 有正确的文档记录并且可以安全使用。

【讨论】:

好的,我现在明白了......它的工作!但是,从风格的角度来看,它有点暗,不是吗? 我知道您希望我使用比较功能改进什么(现在出现的名称不正确)。事实上,我无法真正比​​较那个地方的两个程序,因为新程序还不存在。如果我真的需要基于着色器足迹构建一种新的程序风格,我只是在关注实时程序。但我喜欢这个主意,注意! :) @SébastienBémelmans 你最好使用 std::set::insert 。它会检查密钥是否存在,然后放置一个实例。然后你需要实现一个operator==。另外,请查看en.cppreference.com/w/cpp/container/set 所以如果我按照你的想法,我会改变我的班级成员“std::vector> m_programs;”通过“std::set::<:shared_ptr program>> m_programs;” ? 嗯,是的。但不要忘记第二个参数,它是一个比较函数,用 std::integral_constant 包裹。这将使容器能够比较对象,而不是指针。虽然我不确定您的方法总体上是否良好,但您必须搜索是否存在具有相同参数的着色器程序。我会避免只有两个类似程序的可能性,而不是运行那种检查。

以上是关于C++ CppCheck算法建议(std::find_if代替原始循环)相关性的主要内容,如果未能解决你的问题,请参考以下文章

在声纳中使用 C++ 社区插件的问题。 Cppcheck 不起作用

如何为 C++ 代码使用 cppcheck 的内联抑制过滤器选项?

C++代码审查工具Cppcheck和TscanCode

带有空大括号的 C++ 新初始化触发 cppcheck uninitvar 错误

使用 CPPCHECK 在 Red Hat Enterprise Linux (RHEL) 上出现 C++ 宏问题

c++代码检测工具