Я использую много STL
код с std::for_each
, bind
и т. Д., Но я заметил, что иногда использование STL
- это не очень хорошая идея.Сколько из STL слишком много?
Например, если у вас есть std::vector
и хотите сделать одно действие для каждого элемента вектора, ваша первая идея состоит в том, чтобы использовать эту функцию:
std::for_each(vec.begin(), vec.end(), Foo())
и это элегантный и хорошо, на некоторое время. Но затем появляется первый набор отчетов об ошибках, и вам нужно изменить код. Теперь вы должны добавить параметр для вызова Foo()
, так что теперь она становится:
std::for_each(vec.begin(), vec.end(), std::bind2nd(Foo(), X))
но это лишь временное решение. Теперь проект созревает, и вы понимаете бизнес-логику намного лучше, и вы хотите добавить новые изменения в код. Именно в этот момент вы понимаете, что вам следует использовать старый товар:
for(std::vector::iterator it = vec.begin(); it != vec.end(); ++it)
Это случается только для меня? Вы распознаете этот тип шаблона в своем коде? Имеете ли вы аналогичные анти-шаблоны, используя STL
?
BTW, если в вашем втором примере «X» одинаково для всех элементов. Просто передайте его конструктору Foo и сохраните его в функторе вместо привязки. Гораздо проще. –
На самом деле вы не используете ни один из STL, поэтому вы в безопасности :) –
Просто мнение, но «слишком много» - это когда вы используете функции, которые вам не нужны исключительно ради их использования. Если это полезно, используйте его. Если вы беспокоитесь о слишком длинных именах, вы всегда можете использовать псевдоним typedef или псевдоним пространства имен, чтобы сократить их (например, 'typedef std :: vector :: iterator VecIter;'). Вещь со стандартной библиотекой - это, как правило, самый чистый общий способ сделать что-то на данном компиляторе просто потому, что либо создатели компилятора, либо люди, которые знают это лучше всего (если не создатели), напишут его реализацию. Не бойтесь использовать его, когда это полезно. –