Ant*_*rez 41 c++ algorithm stl stdmap std-pair
我有一个地图,我想在每个数据类型对象成员函数上执行调用.我还知道如何在任何序列上执行此操作但是,是否可以在关联容器上执行此操作?
我能找到的最接近的答案是: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)
它看起来太混淆了,我真的不喜欢它.有什么建议?
Seb*_*ian 85
C++ 11允许您:
for (const auto& kv : myMap) {
std::cout << kv.first << " has value " << kv.second << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
更新:
如果您不想修改地图,则const auto更安全.
ere*_*eOn 53
您可以遍历std::map对象.每个迭代器都将指向您在std::pair<const T,S>其中指定的位置T和S类型map.
这将是:
for (std::map<int, MyClass>::iterator it = Map.begin(); it != Map.end(); ++it)
{
it->second.Method();
}
Run Code Online (Sandbox Code Playgroud)
如果您仍想使用std::for_each,请传递一个std::pair<const int, MyClass>&以参数为参数的函数.
例:
void CallMyMethod(std::pair<const int, MyClass>& pair) // could be a class static method as well
{
pair.second.Method();
}
Run Code Online (Sandbox Code Playgroud)
并传递给std::for_each:
std::for_each(Map.begin(), Map.end(), CallMyMethod);
Run Code Online (Sandbox Code Playgroud)
C++ 14带来了通用的lambdas.这意味着我们可以非常轻松地使用std :: for_each:
std::map<int, int> myMap{{1, 2}, {3, 4}, {5, 6}, {7, 8}};
std::for_each(myMap.begin(), myMap.end(), [](const auto &myMapPair) {
std::cout << "first " << myMapPair.first << " second "
<< myMapPair.second << std::endl;
});
Run Code Online (Sandbox Code Playgroud)
我认为std :: for_each有时比基于循环的简单范围更适合.例如,当您只想循环遍历地图的子集时.
简单的C++怎么样?(示例根据@Noah Roberts的说明修复)
for(std::map<int, MyClass>::iterator itr = Map.begin(), itr_end = Map.end(); itr != itr_end; ++itr) {
itr->second.Method();
}
Run Code Online (Sandbox Code Playgroud)