STL C++: Какой метод повторения по контейнеру STL лучше?

Вам не нужно преобразовывать свои задачи в именованные функции - хотя это считается лучшей практикой и это легко сделать.

Чтобы исправить задачу наблюдения, попробуйте:

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 ее выполнять.

12
задан Ashwin Nanjappa 4 April 2009 в 08:30
поделиться

7 ответов

Первые работы версии с любым контейнером и так более полезны в шаблонных функциях, которые берут любой контейнер s параметр. Это также очевидно немного более эффективно, даже для векторов.

Вторая версия только работает на векторы и другие индексированные целым числом контейнеры. Это было бы несколько более идиоматичный для тех контейнеров, быть понятным вновь прибывшим к C++, и полезно, если необходимо сделать что-то еще с индексом, который весьма распространен.

Как обычно, там не просто, "этот - лучший" ответ, я боюсь.

16
ответ дан 2 December 2019 в 03:29
поделиться

Если Вы не возражаете (очень?) маленькое снижение эффективности, я рекомендовал бы использовать Повышение. Foreach

BOOST_FOREACH( Elem& e, elemVec )
{
    // Your code
}
8
ответ дан 2 December 2019 в 03:29
поделиться

Метод 0 быстрее и поэтому рекомендуется.

Метод 1 размер использования (), которому позволяют быть O (1), в зависимости от контейнера и stl реализации.

6
ответ дан 2 December 2019 в 03:29
поделиться

Еще некоторые преимущества метода 0:

  • если Вы перемещаетесь от вектора до другого контейнера, цикл остается тем же,
  • легкий переместиться от итератора до const_iterator, если Вам нужно,
  • когда C++ 0x прибудет, автоматический ввод уменьшит часть помехи кода.

Основной недостаток - то, что во многих случаях Вы сканируете два контейнера, в этом случае индекс является более чистым, чем хранение двух итераторов.

4
ответ дан 2 December 2019 в 03:29
поделиться

Метод 0, по нескольким причинам.

  • Это лучшие экспрессы Ваше намерение, которое помогает оптимизации компилятора, а также удобочитаемости
  • Ошибки диапазона менее вероятны
  • Это работает даже при замене вектора списком который не имеет оператора []

Конечно, лучшим решением часто будет решение 2: Один из алгоритмов станд. станд.:: for_each, станд.:: преобразуйте, станд.:: копия или независимо от того, что Вам нужно. Это имеет некоторые дальнейшие преимущества:

  • Это выражает Ваше намерение еще лучше и позволяет некоторую значительную оптимизацию компилятора (безопасный SCL MS выполняет границы, проверяющие Ваши методы 0 и 1, но пропустит его на алгоритмах станд.),
  • Это - меньше кода (на сайте вызова, по крайней мере. Конечно, необходимо записать функтор или что-то для замены тела цикла, но на сайте использования, код очищен вполне немного, который является, вероятно, где это имеет значение больше всего.

В целом постарайтесь не чрезмерно определять свой код. Укажите точно, что Вы хотите сделанный, и ничто иное. Алгоритмы станд. обычно являются способом пойти туда, но даже без них, если Вам не нужен индекс i, почему это имеет? Используйте итераторы в этом случае.

2
ответ дан 2 December 2019 в 03:29
поделиться

Это зависит от который тип контейнера. Для a vector, это, вероятно, не имеет значения, который Вы используете. Метод 0 стал более идиоматичным, но их не большая разница, как все говорят.

Если Вы решили использовать a list, вместо этого, метод 1, в принципе, был бы O(N), но на самом деле нет никакого списка at() метод, таким образом, Вы не можете даже сделать этого тот путь. (Таким образом в немного выравниваются, Ваш вопрос подтасовывает карты.)

Но это сам по себе - другой аргумент в пользу метода 0: это использует тот же синтаксис для различных контейнеров.

1
ответ дан 2 December 2019 в 03:29
поделиться

По совпадению я недавно сделал тест скорости (заполняющийся 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 только хуже для в (), который нормален, потому что это - единственная проверенная в диапазоне функция тестов.

2
ответ дан 2 December 2019 в 03:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: