2013-04-23 70 views
2

使用BOOST的ForEach和我自己定製的#define宏來遍歷容器之間的區別是什麼?C++ BOOST ForEach vs自定義宏

礦:

#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'擴展名的編譯器上運行。 – 2013-04-23 21:43:52

+1

有一個區別是'BOOST_FOREACH'能夠處理普通數組,即'char a [] = {「Hello,world!」};'。 – 2013-04-23 21:56:56

+0

你不應該依賴'typeof',那不是標準的C++。你應該使用'decltype' – 2013-04-23 22:04:28

回答

2

一大區別,就是在使用你的右值,就像這樣:

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檢測,如果它是一個右值,使複印件(可以由編譯器被省略)。

第二個區別是BOOST_FOREACH使用Boost.Range來檢索迭代器。這使它可以很容易地擴展。所以它可以在陣列和std::pair上工作。

第三個區別是,您的iterate宏會自動推導出該範圍的類型,這在支持typeof而不是auto的較早編譯器上可能非常方便。但是,BOOST_FOREACH將適用於所有C++ 03編譯器。

+0

您似乎暗示'BOOST_FOREACH'只適用於支持'auto'的編譯器。這不是真的。 'BOOST_FOREACH'沒有使用任何C++ 11特性,實際上它可以用於古老的編譯器。 'BOOST_FOREACH'是100%兼容的C++ 03,它是OP的'iterate'宏的另一個區別。 – 2013-04-26 14:59:08

+0

@EricNiebler對不起,我不是故意暗示它需要'auto',我糾正它使其更清楚。 – 2013-05-01 04:08:25