2

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

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

4

1 回答 1

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支持的旧编译器上非常方便。但是,将适用于所有 C++03 编译器。typeofautoBOOST_FOREACH

于 2013-04-25T17:07:46.430 回答