- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
来自 boost doc ,
This results in near-optimal code generation; the performance of BOOST_FOREACH is usually within a few percent of the equivalent hand-coded loop.
我想使用宏和非标准的 typeof 运算符,我们可以生成完全等效的一个。 BOOST_FOREACH 的什么特性使它不准确?
编辑:
我的版本:
#define EACH(it,v) \
for(typeof(v.begin()) it = v.begin();it != v.end(); ++it)
//use this if you want a const_iterator from a non-const container
#define CONST_EACH(it,v) \
typedef typeof(v) v_type; \
typedef const v_type& const_type; \
for(typeof(static_cast<const_type>(v).begin()) it = static_cast<const_type>(v).begin(); it != static_cast<const_type>(v).end(); ++it)
我正在尝试编写一个没有任何开销的版本。这使用了非标准的 typeof 并给出了迭代器而不是 value_type。我在这里遗漏了什么吗?
最佳答案
Boost foreach 远非微不足道。使用 gcc 4.6:
int main()
{
std::string hello( "Hello, world!" );
BOOST_FOREACH( char ch, hello )
{
std::cout << ch;
}
return 0;
}
生成大量用 A?B:C
探测的案例。
int main()
{
std::string hello( "Hello, world!" );
if (
boost::foreach_detail_::auto_any_t _foreach_col9 =
boost::foreach_detail_::contain( (hello) , (true ? 0 :
boost::foreach_detail_::or_(
boost::foreach_detail_::and_(
boost::foreach_detail_::not_(
boost::foreach_detail_::is_array_(hello)) , (true ? 0 :
boost::foreach_detail_::is_rvalue_( (true ?
boost::foreach_detail_::make_probe(hello) : (hello)), 0))) ,
boost::foreach_detail_::and_(
boost::foreach_detail_::not_(boost_foreach_is_noncopyable(
boost::foreach_detail_::to_ptr(hello) , boost_foreach_argument_dependent_lookup_hack_value)) , boost_foreach_is_lightweight_proxy(
boost::foreach_detail_::to_ptr(hello) , boost_foreach_argument_dependent_lookup_hack_value)))))) {} else if (
boost::foreach_detail_::auto_any_t _foreach_cur9 =
boost::foreach_detail_::begin( _foreach_col9 , (true ? 0 :
boost::foreach_detail_::encode_type(hello,
boost::foreach_detail_::is_const_(hello))) , (true ? 0 :
boost::foreach_detail_::or_(
boost::foreach_detail_::and_(
boost::foreach_detail_::not_(
boost::foreach_detail_::is_array_(hello)) , (true ? 0 :
boost::foreach_detail_::is_rvalue_( (true ?
boost::foreach_detail_::make_probe(hello) : (hello)), 0))) ,
boost::foreach_detail_::and_(
boost::foreach_detail_::not_(boost_foreach_is_noncopyable(
boost::foreach_detail_::to_ptr(hello) , boost_foreach_argument_dependent_lookup_hack_value)) , boost_foreach_is_lightweight_proxy(
boost::foreach_detail_::to_ptr(hello) , boost_foreach_argument_dependent_lookup_hack_value)))))) {} else if (
boost::foreach_detail_::auto_any_t _foreach_end9 =
boost::foreach_detail_::end( _foreach_col9 , (true ? 0 :
boost::foreach_detail_::encode_type(hello,
boost::foreach_detail_::is_const_(hello))) , (true ? 0 :
boost::foreach_detail_::or_(
boost::foreach_detail_::and_(
boost::foreach_detail_::not_(
boost::foreach_detail_::is_array_(hello)) , (true ? 0 :
boost::foreach_detail_::is_rvalue_( (true ?
boost::foreach_detail_::make_probe(hello) : (hello)), 0))) ,
boost::foreach_detail_::and_(
boost::foreach_detail_::not_(boost_foreach_is_noncopyable(
boost::foreach_detail_::to_ptr(hello) , boost_foreach_argument_dependent_lookup_hack_value)) , boost_foreach_is_lightweight_proxy(
boost::foreach_detail_::to_ptr(hello) , boost_foreach_argument_dependent_lookup_hack_value)))))) {} else for (bool _foreach_continue9 = true; _foreach_continue9 && !
boost::foreach_detail_::done( _foreach_cur9 , _foreach_end9 , (true ? 0 :
boost::foreach_detail_::encode_type(hello,
boost::foreach_detail_::is_const_(hello)))); _foreach_continue9 ?
boost::foreach_detail_::next( _foreach_cur9 , (true ? 0 :
boost::foreach_detail_::encode_type(hello,
boost::foreach_detail_::is_const_(hello)))) : (void)0) if (
boost::foreach_detail_::set_false(_foreach_continue9)) {} else for (char ch =
boost::foreach_detail_::deref( _foreach_cur9 , (true ? 0 :
boost::foreach_detail_::encode_type(hello,
boost::foreach_detail_::is_const_(hello)))); !_foreach_continue9; _foreach_continue9 = true)
{
std::cout << ch;
}
return 0;
}
您可能想要遍历的事物类型太多了。使用 c++11,不再需要所有这些技巧,因为您可以使用
遍历几乎所有内容for(auto const &a: something){ .. }
或
for(auto a=begin(something);a!=end(something);++i){ .. }
关于c++ - 为什么 BOOST_FOREACH 不完全等同于手工编码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9377213/
我有一个包含一些数据的类,我想添加 begin()和 end()提供数据 ID 迭代器的函数。 我正在使用 Boost counting_iterator : #include #include
我正在编写 C++98(抱歉),但使用的是 C 库,它有许多对象存储在以下形式的数据结构中: struct c_container { size_t len; int data[1];
我尝试使用 Boost 库,我复制了整个 boost 文件夹,除了 docs、libs、more、status、tools 文件夹。 当我尝试使用下面的代码块时,我的编译器无法识别两件事。 vecto
我想使用 BOOST_FOREACH在我的代码库中使用我无法更改的遗留容器类型之一。 我在该类型上定义了以下方法: .length() 返回容器中元素的当前数量 .operator[](unsigne
我尝试在模板函数中使用 BOOST_FOREACH 和自定义但类型参数独立的迭代器。我收到 4-5 个错误,表明我的迭代器类没有很好地定义为迭代器。 在不使用 BOOST_FOREACH 的情况下重写
我想知道在调用之前获取对 vector 的引用是否有任何好处BOOST_FOREACH 或返回引用的方法调用是否会被自动使用?例如,以下两个循环中的哪一个将等同于第三个循环? vector& my_m
给定以下简单代码: list m_listOfOBjects; .... MyClass* ptrToMyClass; BOOST_FOREACH(MyClass object, m_listOfOb
我实现了一个简单的类 MyClass,其中有一个分配有 new 的数组(我知道我可以使用 STL 容器,但我试图理解他们是如何工作的)。我还创建了一个迭代器子类,能够迭代 MyClass 对象的所有元
我想使用 BOOST_FOREACH 宏来迭代我的 vector 中的一堆值。 vector 看起来像这样: struct _Element { int key; // more va
我测试了我的程序,并决定将 BOOST_FOREACH 宏更改为带有 const_iterator 的简单 for 循环。 我收到了意想不到的结果:使用 for 时程序运行速度变慢。 然后我写了一个小
我有一个 BOOST_FOREACH 循环来遍历列表。不幸的是,我还需要将迭代器缓存到特定项。 typedef List::iterator savedIterator; BOOST_FOREACH(
当使用BOOST_FOREACH时,下面的代码安全吗? BOOST_FOREACH (const std::string& str, getStrings()) { ... } ... std::
如果 BOOST_FOREACH 正在迭代的容器在 BOOST_FOREACH 范围内发生更改,会发生什么情况? BOOST_FOREACH 是否“卡住”初始状态? 最佳答案 在这种情况下,行为是未定
考虑以下代码,使用 BOOST_FOREACH 宏迭代一个侵入式列表: #include #include typedef boost::intrusive::list > MyList; voi
来自 boost doc , This results in near-optimal code generation; the performance of BOOST_FOREACH is usu
我有一个场景 vector ,vector .迭代元素的正确方法是什么,是否作为引用? 例如这个: BOOST_FOREACH(Scene scene, mScenes) { .....
我有以下宏: #define FOREACH(decl, c) BOOST_FOREACH(decl, std::make_pair((c).begin(), (c).end())) (我正在使用这个
我想听听您对 BOOST_FOREACH 使用的建议。 我已经阅读了它,因为它是一个非常沉重的标题,但实际上并不推荐它。 此外,它强制使用“break”和“continue”语句,因为您不能真正拥有由
我知道应该最后归咎于 boost 或编译器,但我在这里看不到其他解释。我正在使用 msvc 2008 SP1 和 boost 1.43。 在以下代码片段中,执行永远不会离开 第三个 BOOST_FOR
你可以使用 boost::filesystem 和 BOOST_FOREACH 遍历目录中的所有文件吗?我试过了 path dirPath = ... int fileCount = 0; BOOST
我是一名优秀的程序员,十分优秀!