Как применять алгоритмы C ++ STD в этом контексте? - PullRequest
2 голосов
/ 22 марта 2020

Я изучаю c ++, и я хотел бы знать, как я могу улучшить следующий код:

std::vector<float> distances;
std::for_each(play_->get_emps().begin(), play_->get_emps().end(), [distances, tank] (const auto& e) {
    distances.push_back(math::distance(e.location(), tank->location()));
});

Должен быть лучший способ заполнить вектор std :: алгоритмами?

1 Ответ

4 голосов
/ 22 марта 2020

std::transform - это алгоритм, который применяет функцию к каждому элементу в диапазоне (или двум диапазонам) и сохраняет результат в другом диапазоне (также может быть равен любому входному диапазону).

std::vector<float> distances;
std::transform(play_->get_emps().begin(), play_->get_emps().end(), 
               std::back_inserter(distances),
               [tank](const auto& e) {return math::distance(e.location(), tank->location();});

<algorithm> это круто, но иногда это излишнее ИМО. for l oop было бы еще проще:

std::vector<float> distances;
for(const auto& e: play_) {
    distances.push_back(math::distance(e.location(), tank->location()));
}

Как отметил Март c Glisse в комментариях, обе версии выиграли бы от вызова std::vector::reserve заранее. push_back является довольно неэффективным при частом использовании (std::back_inserter также использует push_back для внутреннего использования)

std::vector<float> distances;
distances.reserve(play_.size());
...