![]() |
![]() ![]() ![]() ![]() ![]() |
![]() |
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 value):
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 }
Итерация переоценки не работает на некоторых старых компиляторов. Проверьте раздел Portability, чтобы узнать, поддерживает ли ваш компилятор это.
BOOST_FOREACH
Prettier
Люди жаловались на имя BOOST_FOREACH
. Слишком долго. ALL CAPS
может утомительно посмотреть. Это может быть правдой, но BOOST_FOREACH
- это всего лишь соблюдение Бостовой Конвенции о наименовании. Это не значит, что ты застрял с этим. Если вы хотите использовать другой идентификатор (foreach_
, возможно), вы можете просто сделать:
#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) ::
реклама |