2013-04-23 2 views
2

В чем разница между использованием BOOST's ForEach и моим собственным #define макросом для итерации через контейнер?C++ BOOST ForEach vs custom defined Macro

шахта:

#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; 
} 

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

+4

Boost, скорее всего, сконфигурировал свой код для работы на компиляторах, у которых нет нестандартного расширения 'typeof'. –

+1

Одно из отличий заключается в том, что 'BOOST_FOREACH' работает с равными массивами, т. Е.' Char a [] = {"Hello, world!"}; '. –

+0

вы не должны полагаться на 'typeof', это не стандартный C++. вы должны использовать 'decltype' –

ответ

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 обнаруживает, если это Rvalue и делает копию (которая может быть Опущенные компилятором).

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

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

+0

Вы, кажется, подразумеваете, что 'BOOST_FOREACH' работает только с компиляторами, которые поддерживают' auto'. Это не правда. 'BOOST_FOREACH' не использует никаких функций C++ 11 и фактически работает над положительно древними компиляторами. 'BOOST_FOREACH' является совместимым с C++ 03 на 100%, что является еще одним отличием между ним и макросом OPTER. –

+0

@EricNiebler Извините, я не хотел подразумевать, что это требовало 'auto', я исправил его, чтобы сделать его более понятным. –

 Смежные вопросы

  • Нет связанных вопросов^_^