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 uninitvar 错误