![]() |
![]() ![]() ![]() ![]() ![]() |
![]() |
Chapter 12. Boost.ForeachBoost , The Boost C++ Libraries BoostBook Documentation Subset , Part I. The Boost C++ Libraries (BoostBook Subset)
|
![]() |
Note |
---|---|
Поддержка контейнеров STL очень общая; все, что выглядит как контейнер STL, имеет значение. Если он имеет вложенные< |
См. разделРасширяемость, чтобы узнать, как заставить<BOOST_FOREACH
>работать с другими типами.
Ниже приведены некоторые примеры, демонстрирующие различные способы использования<BOOST_FOREACH
>.
Перемещайте через контейнер STL:
std::list<int> list_int( /*...*/ ); BOOST_FOREACH( int i, list_int ) { // do something with i }
Итерация по массиву с ковариацией (т.е. тип переменной итерации не совсем совпадает с типом элемента контейнера):
short array_short[] = {1,2,3}; BOOST_FOREACH( int i, array_short ) { // The short was implicitly converted to an int }
Предваряйте переменную петли и используйте<break
>,<continue
>и<return
>в корпусе петли:
std::deque<int> deque_int( /*...*/ ); int i = 0; BOOST_FOREACH( i, deque_int ) { if( i == 0 ) return; if( i == 1 ) continue; if( i == 2 ) break; }
Перемещайте последовательность по ссылке и модифицируйте базовую последовательность:
short array_short[] = { 1, 2, 3 }; BOOST_FOREACH( short & i, array_short ) { ++i; } // array_short contains {2,3,4} here
Перемещайтесь по вектору векторов с вложенными<BOOST_FOREACH
>петлями. В этом примере обратите внимание, что брекеты вокруг корпуса петли не нужны:
std::vector<std::vector<int> > matrix_int; BOOST_FOREACH( std::vector<int> & row, matrix_int ) BOOST_FOREACH( int & i, row ) ++i;
Итерировать над выражением, возвращающим последовательность по значению (т.е. значение r):
extern std::vector<float> get_vector_float(); BOOST_FOREACH( float f, get_vector_float() ) { // Note: get_vector_float() will be called exactly once }
Итерировать в обратном направлении:
std::list<int> list_int( /*...*/ ); BOOST_REVERSE_FOREACH( int i, list_int ) { // do something with i }
Переименование значений R не работает на некоторых старых компиляторах. Проверьте разделПортативность, чтобы узнать, поддерживает ли ваш компилятор это.
BOOST_FOREACH
Prettier
Люди жаловались на имя<BOOST_FOREACH
>. Слишком долго.<ALLCAPS
>Посмотреть можно. Это может быть правдой, но<BOOST_FOREACH
>просто следуетКонвенции об усилении наименования. Но это не значит, что ты застрял с этим. Если вы хотите использовать другой идентификатор (61), вы можете просто сделать:
#define foreach_ BOOST_FOREACH #define foreach_r_ BOOST_REVERSE_FOREACH
Только если вы уверены, что выбранный вами идентификатор не вызовет конфликтов имен в вашем коде.
![]() |
Note |
---|---|
Не используйте< |
И, наконец, предупреждение. Многие люди используют<foreach
>макрос как короткую форму<BOOST_FOREACH
>. Я не одобряю это. Это приводит к конфликтам имен внутри самого макроса<BOOST_FOREACH
>, где<foreach
>является именем пространства имен. Кроме того,<foreach
>является достаточно распространенным идентификатором; дажеQtопределяет его как макрос. Если вы настаиваете на использовании<foreach
>, вы можете попробовать что-то вроде этого:
#include <boost/foreach.hpp> namespace boost { // Suggested work-around for https://svn.boost.org/trac/boost/ticket/6131 namespace BOOST_FOREACH = foreach; } #define foreach BOOST_FOREACH
Это будет работать вокругнекоторыхпроблем, с которыми вы, вероятно, столкнетесь, но не все. Предпочитает использовать другой идентификатор.
Последний пересмотр: 21 сентября 2016 года в 14:37:17 GMT |
Статья Chapter 12. Boost.Foreach раздела The Boost C++ Libraries BoostBook Documentation Subset Part I. The Boost C++ Libraries (BoostBook Subset) может быть полезна для разработчиков на c++ и boost.
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.
:: Главная :: Part I. The Boost C++ Libraries (BoostBook Subset) ::
реклама |