C ++ BOOST ForEach与自定义宏

时间:2013-04-23 21:39:20

标签: c++ boost macros iterator boost-iterators

使用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;
}

请解释哪种方法更好,为什么?

1 个答案:

答案 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检测它是否是一个右值并进行复制(可以被编译器省略)。

第二个区别是BOOST_FOREACH使用Boost.Range来检索迭代器。这使它可以轻松扩展。因此它适用于数组和std::pair

第三个区别是,您的iterate宏会自动推断出范围的类型,这对于支持typeof但不支持auto的旧编译器非常方便。但是,BOOST_FOREACH将适用于所有C ++ 03编译器。