用C 中的lambda替换功能
Replacing a function with a lambda in C++
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; });
相关文章:
- 在执行其他功能的同时播放动画(LED矩阵和Arduino/ESP8266)
- 多态性和功能结合
- 模板参数替换失败,并且未完成隐式转换
- 带内存和隔离功能的SQLite
- 如何用转义符替换字符串中的所有特殊字符
- 将 Boost MPL 容器替换为 C++17 功能
- 如何用共享库替换可执行C++程序的功能?
- 我有模板功能.通过使用函数std::for_each,用这个容器中的最大数字替换每个正数
- 用C 中的lambda替换功能
- STD功能替换向量中的字节范围
- C 如何通过空实现选择性地替换功能
- 用Armadillo功能替换“稀疏”
- 使用投掷来替换C 非流动功能中的返回
- C++ 如果要替换的句子具有"+"符号,则替换字符串功能不起作用
- 是否可以保证C++标准库容器调用可替换的新功能
- 是否有 C++/C 的高效构建功能可以快速均匀地对 b 条目进行采样,而无需替换 n 个条目?
- 为什么替换在此功能模板中失败
- wxWidgets 3.0-新特性和功能,添加和替换不推荐使用的特性和功能
- 替换功能不起作用
- 无法创建mock类/对象来替换我的类中的私有成员对象的功能,以便在gtest中进行单元测试