#c
#c
Вопрос:
У меня есть три вектора, vec1
, vec2
и vec3
.
Я хочу добавить все три из них и сохранить результат в vec1.
В настоящее время я делаю это,
std::transform(vec1.begin(), vec1.end(), vec2.begin(), vec1.begin(), std::plus<double>());
std::transform(vec1.begin(), vec1.end(), vec3.begin(), vec1.begin(), std::plus<double>());
Я чувствую, что должен быть в состоянии сделать это немного быстрее, чем описано выше, может быть, за одно преобразование. Есть идеи, как это сделать?
vec1
маленький. обычно около 250 элементов.
Комментарии:
1. цикл, который добавляет элементы из трех векторов? Не все должно решаться стандартными алгоритмами, я не знаю ни одного, который работает в 3 диапазонах
2. @largest_prime_is_463035818 возможно, вы правы. мой вектор обычно имеет длину около 250 элементов. Поэтому я думаю, что это должно быть быстрее, если я просто переберу их.
3. @Morpheus, это не похоже
std::transform
на то, что он не собирается перебирать ваш вектор 🙂4. количество элементов не имеет значения. Стандартные алгоритмы не являются волшебными,
std::transform
они не более чем запуск цикла и использование предиката для назначения целевому диапазону5.
let vec3 = compose2 ( ) <$> vec1 <*> vec2 <*> vec3
Ответ №1:
Это более эффективно, чем 2 вызова std::transform
:
for (size_t i = 0; i < vec1.size(); i) {
vec1[i] = vec2[i] vec3[i];
}
Вы могли бы написать алгоритм для этого, но в стандартной библиотеке нет ни одного, который бы делал это «из коробки». Вы могли бы использовать какой-нибудь странный предикат, но это скорее снизит читаемость, чем улучшит ее.
Обратите внимание, что основной причиной использования стандартных алгоритмов является не производительность. Если вы посмотрите на их реализацию, вы поймете, что все, что нужно, чтобы сделать их универсальными, они не отличаются от цикла, который вы могли бы написать самостоятельно. Основным преимуществом их использования является выразительность и удобочитаемость. Если нет алгоритма, доступного для выполнения того, что вам нужно напрямую, злоупотребление алгоритмом приведет к обратному: нечитаемости и сложному коду. Приведенное выше действительно более эффективно, чем два вызова std::transform
.