Using count_if with stl Map container class

Hi,

I'm quite new to C++ and and could not find anything on the net via Google that can help me answer this question.

Suppose I have a map container declared as:  map<int, state>
where state is an enum of three possible values.  

I was wondering if I can use count_if to return the total number count for all pairs in the map where state = SOME_VALUE

Of course, I can create a trivial function to count this myself, but wanted to use a pre-existing algorithm from STL.

Thanks.

- Dan
dkf360Asked:
Who is Participating?
 
efnCommented:
Yes, you can do that.

You will have to pass count_if an iterator to the beginning of the map, an iterator to the end of the map, and a predicate.  You can get the iterators from the map's begin() and end() functions.

The predicate is more tricky.  count_if has to be able to call it like a function, with a map element as a parameter and a bool return value.  So if you only wanted to count the elements with some one value you could hard-code, you could just code that value in a function, like this:

bool predicate(const pair<int, state>& inputPair)
{
    return inputPair.second == SOME_VALUE;
}

With this definition, you would just pass "predicate" (without the quote marks) as the third parameter to count_if.

If you need the value checked to be variable at run-time, it's more complicated, but still possible.  You can pass a function object that has the value stored in it at run_time.  For example:

struct statePredicate
{
      //  The constructor saves the value to be checked.
      statePredicate(state inputState) : m_state(inputState) {}
      //  The operator() function lets an object of this class be called like a function.
      bool operator() (const pair<int, state>& pr)
      {
            //  Report whether the map element has the value previously passed to the constructor.
            return pr.second == m_state;
      }
      state m_state;
};

In this case, as the third parameter to count_if, you would pass a temporary statePredicate object constructed with the value you wanted counted.  For example:

size_type count = count_if(amap.begin(), amap.end(), statePredicate(SOME_VALUE));

--efn
0
 
dkf360Author Commented:
Thanks.  It was exactly what I needed to know.
0
 
Infinity08Commented:
And for your reference, take a look at this for the STL map :

        http://www.cplusplus.com/reference/stl/map/

and more specifically, for count_if :

        http://www.cplusplus.com/reference/algorithm/count_if.html
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.