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