用C 中的lambda替换功能

Replacing a function with a lambda in C++

本文关键字:替换 功能 lambda 中的      更新时间:2023-10-16

i具有一个函数,该函数仅将1个值设置为struct成员变量length。在现代C 中,这似乎不像是很好的代码样式。可以用lambda做到这一点吗?

void setEdgeLengths(Koala::AssocArray <koalaGraph::PEdge, Koala::DijkstraHeap::EdgeLabs<int >> &edgeMap, std::vector<koalaGraph::PEdge>& E) 
{
    for (size_t i = 0; i < E.size(); i++) {
    edgeMap[E[i]].length = 1;
    }
}

我要问的原因是https://shaharmike.com/cpp/lambdas-and-functions/建议lambda比普通功能更快。

Lambdas在性能方面也很棒。因为它们是对象而不是指针,它们很容易被编译器插入,就像函子一样。这意味着多次调用lambda(例如用std :: sort :: sort :: copy_if)比使用全局函数要好得多。这是C 实际上比C。

更快的一个例子

我将考虑以下代码最佳(除了给定的变量名):

void setEdgeLengths(Koala::AssocArray <koalaGraph::PEdge, Koala::DijkstraHeap::EdgeLabs<int >> &edgeMap, std::vector<koalaGraph::PEdge>& E) 
{
    for (const auto& e : E) {
        edgeMap[e].length = 1;
    }
}

样式(或省略)卷曲的牙套。

您可以将其中的任何或全部都放入任意的许多嵌套兰伯达人中,但这并不是有用(但可能更有害,至少在调试构建中),而不是添加更多的空间。您可能想要求的是:

void setEdgeLengths(Koala::AssocArray <koalaGraph::PEdge, Koala::DijkstraHeap::EdgeLabs<int >> &edgeMap, std::vector<koalaGraph::PEdge>& E) 
{
    std::for_each(E.begin(), E.end(), [&edgeMap](const auto& e) {
        edgeMap[e].length = 1;
    });
}

您不再有一个普通的循环(有些提倡良好的风格),但我认为代码并不清楚。这样做也不会更快 - 如果有的话,调试性能可能会稍微降低。

现在,后者表格 di d 允许通过执行

进行并行执行
std::for_each(std::execution::parallel, E.begin(), E.end(), [&edgeMap](const auto& e) {

但是,只有当您的edgeMap正确处理并发访问时,这才是合法的。如果是std::map,则operator[]可能会插入一个新元素(不是线程安全),因此如果没有进一步的假设,这将不是法律优化。

如果要将操作应用于容器的每个元素,则可以使用std::for_each。由于您想使用E的每个元素访问edgeMap,因此您会在E上使用for_each,例如

Koala::AssocArray <koalaGraph::PEdge, Koala::DijkstraHeap::EdgeLabs<int >> edgeMap = /* stuff */;
std::vector<koalaGraph::PEdge> E = /* stuff */;
std::for_each(E.begin(), E.end(),[&](auto const& index){ edgeMap[index].length = 1; });