如何使用boost :: ptr_map有效地使用BOOST_FOREACH(字符数/可读性)?
Kristo在他的回答中证明了可以将BOOST_FOREACH与ptr_map一起使用,但它并没有真正省去任何输入(或使我的代码真的更具可读性),而不是使用迭代器迭代ptr_map:
typedef boost::ptr_container_detail::ref_pairIntPair; BOOST_FOREACH(IntPair p, mymap) { int i = p.first; } // vs. boost::ptr_map ::iterator it; for (it = mymap.begin(); it != mymap.end(); ++it) { // doSomething() }
下面的代码就像我希望的那样.它遵循如何将BOOST_FOREACH与std :: map一起使用的标准方法.不幸的是,这不编译:
boost::ptr_mapmymap; // insert something into mymap // ... typedef pair IntTpair; BOOST_FOREACH (IntTpair &p, mymap) { int i = p.first; }
Daniel James.. 16
作为STL样式容器,指针容器具有value_type
可以使用的typedef:
#include#include int main() { typedef boost::ptr_map int_map; int_map mymap; BOOST_FOREACH(int_map::value_type p, mymap) { } }
我发现对容器使用typedef会使代码更容易编写.
此外,您应该尽量避免detail
在boost中使用命名空间的内容,这是一个包含实现细节的提升约定.
作为STL样式容器,指针容器具有value_type
可以使用的typedef:
#include#include int main() { typedef boost::ptr_map int_map; int_map mymap; BOOST_FOREACH(int_map::value_type p, mymap) { } }
我发现对容器使用typedef会使代码更容易编写.
此外,您应该尽量避免detail
在boost中使用命名空间的内容,这是一个包含实现细节的提升约定.
我今天遇到了同样的问题.不幸的是,丹尼尔的建议不适用于对地图的不断引用.在我的例子中,ptr_map是一个类的成员,我想在const成员函数中循环它.借用丹尼尔的例子,这就是我在我的案例中必须做的事情:
#include "boost/ptr_container/ptr_map.hpp" #include "boost/foreach.hpp" int main() { typedef boost::ptr_mapint_map; int_map mymap; const int_map& mymap_const_ref(mymap); BOOST_FOREACH(int_map::const_iterator::value_type p, mymap_const_ref) { } }
这似乎int_map::const_iterator::value_type
相当于boost::ptr_container_detail::ref_pair
.
使用元组保存自己的输入并提高可读性:
boost::ptr_mapmymap; int key; T * value; BOOST_FOREACH(boost::tie(key, value), mymap) { ... }