Я бы посчитал следующий код оптимальным (помимо заданных имен переменных):
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;
});
}
У вас больше нет простого цикла (что некоторые считают хорошим стилем), но я не думаю, что код стал более понятным.Это также не ускорило выполнение этого - во всяком случае, производительность отладки, вероятно, немного снизилась.
Теперь последняя форма делает допускающей параллельное выполнение, выполняя
std::for_each(std::execution::parallel, E.begin(), E.end(), [&edgeMap](const auto& e) {
но это допустимо только в том случае, если ваш edgeMap
правильно обрабатывает одновременный доступ.Если бы это был std::map
, operator[]
потенциально мог бы вставить новый элемент (который не является потокобезопасным), поэтому без дополнительных предположений это не было бы юридической оптимизацией.