我有一个地图,我想在每个数据类型对象成员函数上执行调用.我还知道如何在任何序列上执行此操作但是,是否可以在关联容器上执行此操作?
我能找到的最接近的答案是:Boost.Bind访问std :: for_each中的std :: map元素.但是我不能在我的项目中使用boost,那么是否有一个STL替代品,我缺少boost :: bind?
如果不可能,我想创建一个指向数据对象的指针的临时序列,然后在其上调用for_each,如下所示:
class MyClass
{
public:
void Method() const;
}
std::map<int, MyClass> Map;
//...
std::vector<MyClass*> Vector;
std::transform(Map.begin(), Map.end(), std::back_inserter(Vector), std::mem_fun_ref(&std::map<int, MyClass>::value_type::second));
std::for_each(Vector.begin(), Vector.end(), std::mem_fun(&MyClass::Method));
Run Code Online (Sandbox Code Playgroud)
它看起来太混淆了,我真的不喜欢它.有什么建议?
如何使用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) 在下面的代码中:
BOOST_FOREACH(std::pair<PID, bool> &itval, completedEs_) {
allCompleted &= it->second;
}
Run Code Online (Sandbox Code Playgroud)
我收到这个错误:
错误:宏"BOOST_FOREACH"传递了3个参数,但只有2个
我只传递了两个论点,发生了什么?
std::map< std::string , std::string > matrix_int;
typedef std::pair< std::string , std::string > lp_type;
BOOST_FOREACH( lp_type &row, matrix_int ){
}
Run Code Online (Sandbox Code Playgroud)
这不能被遵守:错误C2440:'初始化':无法从'std :: pair <_Ty1,_Ty2>'转换为'lp_type&'
当我在元素类型中有','时,boost doc说我可以使用typedef或预定义var; 但是当我想要参考时我该怎么办?