Я полностью гагага за STL, абсолютно.Но я не могу вспомнить, чтобы когда-либо использовалось for_each
.
Идиома:
for ( container::iterator it = coll.begin(); it != coll.end(); ++ it )
C ++ 11 вводит сахар, чтобы уменьшить это до
for ( auto elem : coll )
Это похоже на вашу удобную функцию, но использует бесплатные (не являющиеся членами) функции std::begin
и std::end
, которые обеспечивают совместимость с объектами, которые не являются стандартными контейнерами.
Кроме того, при поиске (я не знаю)с этим поиграться, так как его еще нет в GCC), похоже, он ограничивает доступ программиста к элементам диапазона, а не к итераторам.
Что касается использования контейнера для обращения кво всей полноте, гораздо предпочтительнее поддерживать гибкость, позволяющую использовать поддиапазоны.Альтернативное решение - ввести идиому для пары итераторов { begin, end }
.Были некоторые споры, и я ожидал, что C ++ 11 включит такую функцию, что
begin( make_pair( begin_, end_ ) ) // == begin_,
end( make_pair( begin_, end_ ) ) // == end_,
for ( auto elem : make_pair( begin_, end_ ) ) // iterates over [ begin_, end )
, но после прочтения стандарта кажется, что pair
не имеет этой функциональности.
Вы можетеоднако создайте свой собственный pair
, чтобы получить гибкий диапазон на основе for
:
template< typename iter >
struct range_type {
iter first, last;
// use friends because Standard specifies these should be found by ADL:
friend iter begin( range_type const &r ) { return r.first; }
friend iter end( range_type const &r ) { return r.last; }
};
template< typename iter >
range_type< iter > range( iter first, iter last )
{ return range_type< iter >{ first, last }; }
// usage:
for ( auto elem : range( begin_, end_ ) ) // iterates over [ begin_, end )