Вам не нужно преобразовывать свои задачи в именованные функции - хотя это считается лучшей практикой и это легко сделать.
Чтобы исправить задачу наблюдения, попробуйте:
gulp.watch('watch', function(done) {
watch('./app/index.html', gulp.series('html'));
done();
});
Чтобы перейти к именованным функциям:
function html(done) {
gulp.src(….)
console.log('modifying the html');
done();
};
function watch(done) {
watch('./app/index.html', gulp.series('html'));
done();
});
exports.html= gulp.series(html);
exports.default = gulp.series(watch);
Обратите внимание, что теперь задача watch
не вызывается как строка, то есть, 'watch'
, но только watch
.
В exports.html
gulp.series
не является строго необходимым, так как там есть только одна задача, поэтому exports.html= html;
достаточно.
И вам нужно экспортировать задачу, только если вы хотите вызвать ее напрямую (например, из командной строки gulp html
). Если, скажем, задача html
будет вызываться только изнутри другими задачами, то нет необходимости export
ее выполнять.
Первые работы версии с любым контейнером и так более полезны в шаблонных функциях, которые берут любой контейнер s параметр. Это также очевидно немного более эффективно, даже для векторов.
Вторая версия только работает на векторы и другие индексированные целым числом контейнеры. Это было бы несколько более идиоматичный для тех контейнеров, быть понятным вновь прибывшим к C++, и полезно, если необходимо сделать что-то еще с индексом, который весьма распространен.
Как обычно, там не просто, "этот - лучший" ответ, я боюсь.
Если Вы не возражаете (очень?) маленькое снижение эффективности, я рекомендовал бы использовать Повышение. Foreach
BOOST_FOREACH( Elem& e, elemVec )
{
// Your code
}
Метод 0 быстрее и поэтому рекомендуется.
Метод 1 размер использования (), которому позволяют быть O (1), в зависимости от контейнера и stl реализации.
Еще некоторые преимущества метода 0:
Основной недостаток - то, что во многих случаях Вы сканируете два контейнера, в этом случае индекс является более чистым, чем хранение двух итераторов.
Метод 0, по нескольким причинам.
Конечно, лучшим решением часто будет решение 2: Один из алгоритмов станд. станд.:: for_each, станд.:: преобразуйте, станд.:: копия или независимо от того, что Вам нужно. Это имеет некоторые дальнейшие преимущества:
В целом постарайтесь не чрезмерно определять свой код. Укажите точно, что Вы хотите сделанный, и ничто иное. Алгоритмы станд. обычно являются способом пойти туда, но даже без них, если Вам не нужен индекс i
, почему это имеет? Используйте итераторы в этом случае.
Это зависит от который тип контейнера. Для a vector
, это, вероятно, не имеет значения, который Вы используете. Метод 0 стал более идиоматичным, но их не большая разница, как все говорят.
Если Вы решили использовать a list
, вместо этого, метод 1, в принципе, был бы O(N)
, но на самом деле нет никакого списка at()
метод, таким образом, Вы не можете даже сделать этого тот путь. (Таким образом в немного выравниваются, Ваш вопрос подтасовывает карты.)
Но это сам по себе - другой аргумент в пользу метода 0: это использует тот же синтаксис для различных контейнеров.
По совпадению я недавно сделал тест скорости (заполняющийся 10 * 1024 * 1024 ints с рэндом ()).
Это 3 выполнения, время в наносекундах
vect[i] time : 373611869
vec.at(i) time : 473297793
*it = time : 446818590
arr[i] time : 390357294
*ptr time : 356895778
ОБНОВЛЕНИЕ: добавленный станд. stl-алгоритма:: генерируйте, который, кажется, выполняет самое быстрое из-за специальной оптимизации итератора (VC ++ 2008). время в микросекундах.
vect[i] time : 393951
vec.at(i) time : 551387
*it = time : 596080
generate = time : 346591
arr[i] time : 375432
*ptr time : 334612
Заключение: Используйте стандартные алгоритмы, они могли бы быть быстрее, чем явный цикл! (и также хорошая практика)
Обновление: вышеупомянутые времена были в ситуации I/O-bound, я сделал те же тесты с Зависящим от ЦП (выполните итерации по относительно короткому вектору, который должен неоднократно помещаться в кэш, умножить каждый элемент на 2 и записать обратно к вектору),
//Visual Studio 2008 Express Edition
vect[i] time : 1356811
vec.at(i) time : 7760148
*it = time : 4913112
for_each = time : 455713
arr[i] time : 446280
*ptr time : 429595
//GCC
vect[i] time : 431039
vec.at(i) time : 2421283
*it = time : 381400
for_each = time : 380972
arr[i] time : 363563
*ptr time : 365971
Интересно итераторы и оператор [] значительно медленнее в VC ++ по сравнению с for_each (который, кажется, ухудшает итераторы к указателям через некоторое шаблонное волшебство для производительности).
Во времена доступа GCC только хуже для в (), который нормален, потому что это - единственная проверенная в диапазоне функция тестов.