C++ CppCheck 算法建议(std::find_if 而不是原始循环)针对性
C++ CppCheck algorithm suggestion (std::find_if instead of raw loop) pertinence
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 条件附近,我得到了:"Consider using std::find_if algorithm instead of a raw loop."
我尝试使用它,但我无法让 return 工作了...我应该忽略这个建议吗?
我想您可能一次都不需要使用该查找功能。因此,根据 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 有适当的文档记录并且可以安全使用。
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 条件附近,我得到了:"Consider using std::find_if algorithm instead of a raw loop."
我尝试使用它,但我无法让 return 工作了...我应该忽略这个建议吗?
我想您可能一次都不需要使用该查找功能。因此,根据 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 有适当的文档记录并且可以安全使用。