gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 04:41:30 24 4
gpt4 key购买 nike

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

我尝试使用它,但我无法再正常工作...我应该忽略这个建议吗?

最佳答案

我想您可能不止一次需要使用该查找功能。因此,根据 DRY,您需要将调用 std::find_if 算法的 block 分离到不同的包装函数。

{

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

关于C++ CppCheck 算法建议(std::find_if 而不是原始循环)针对性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59125856/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com