C ++ BOOST ForEach против пользовательского макроса

В чем разница между использованием BOOST ForEach и моего собственного пользовательского макроса #define для перебора контейнера?

мой:

#define iterate(i,x)     for(typeof(x.begin()) i=x.begin();i!=x.end();++i)

boost:
#include <string>
#include <iostream>
#include <boost/foreach.hpp>

int main()
{
std::string hello( "Hello, world!" );

BOOST_FOREACH( char ch, hello )
{
std::cout << ch;
}

return 0;
}

Пожалуйста, объясните, какой метод лучше и почему?

2

Решение

Первая большая разница, когда вы используете rvalues, вот так:

vector<int> foo();

// foo() is evaluated once
BOOST_FOREACH(int i, foo())
{

}

// this is evaluated twice(once for foo().begin() and another foo().end())
iterate(i, foo())
{

}

Это потому что BOOST_FOREACH определяет, является ли оно значением r, и создает копию (которая может быть исключена компилятором).

Второе отличие BOOST_FOREACH использования Boost.Range чтобы получить итераторы. Это позволяет легко расширяться. Так что это будет работать на массивах и std::pair,

Третье отличие, это ваш iterate макрос автоматически определяет тип диапазона, что может быть очень удобно на старых компиляторах, которые поддерживают typeof но нет auto, Тем не мение, BOOST_FOREACH будет работать на всех компиляторах C ++ 03.

2

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector