c++algorithmstlstdmapstd-pair

Use of for_each on map elements


I have a map where I'd like to perform a call on every data type object member function. I yet know how to do this on any sequence but, is it possible to do it on an associative container?

The closest answer I could find was this: Boost.Bind to access std::map elements in std::for_each. But I cannot use boost in my project so, is there an STL alternative that I'm missing to boost::bind?

If not possible, I thought on creating a temporary sequence for pointers to the data objects and then, call for_each on it, something like this:

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));

It looks too obfuscated and I don't really like it. Any suggestions?


Solution

  • You can iterate through a std::map object. Each iterator will point to a std::pair<const T,S> where T and S are the same types you specified on your map.

    Here this would be:

    for (std::map<int, MyClass>::iterator it = Map.begin(); it != Map.end(); ++it)
    {
      it->second.Method();
    }
    

    If you still want to use std::for_each, pass a function that takes a std::pair<const int, MyClass>& as an argument instead.

    Example:

    void CallMyMethod(std::pair<const int, MyClass>& pair) // could be a class static method as well
    {
      pair.second.Method();
    }
    

    And pass it to std::for_each:

    std::for_each(Map.begin(), Map.end(), CallMyMethod);