使用 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;
}
请解释哪种方法更好以及为什么?
最佳答案
第一个大的区别是当您使用右值时,如下所示:
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 编译器。
关于C++ BOOST ForEach 与自定义宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16179636/