Go Premium for a chance to win a PS4. Enter to Win

x
?
Solved

Frequency algorithm for STL containers

Posted on 2006-11-21
4
Medium Priority
?
350 Views
Last Modified: 2013-12-14
Is there an STL algorithm to find the element which occurs the most often in a container?
Thanks.
0
Comment
Question by:Rothbard
  • 2
4 Comments
 
LVL 53

Assisted Solution

by:Infinity08
Infinity08 earned 450 total points
ID: 17988552
No, not to my knowledge.

You could use a multiset though, in combination with the count method :

    size_type count(const key_type& k) const

That will give you the number of elements with a certain value (key). If you repeat that for all values, you can easily extract the max.

That's the first though that comes to mind for your requirements ...
0
 
LVL 53

Assisted Solution

by:Infinity08
Infinity08 earned 450 total points
ID: 17988565
fyi, here's a nice list of the STL algorithms :

http://www.josuttis.com/libbook/algolist.pdf
0
 
LVL 39

Accepted Solution

by:
itsmeandnobodyelse earned 1050 total points
ID: 17989557
It is not very difficult to write your own template function, e. g. like the function below.

Regards, Alex


#include <vector>  
#include <iostream>  
#include <algorithm>

template<class I, class T>
int occurs_mostoften(I i1, I i2, T& t)
{
    std::vector<T> v(i1, i2);
    std::sort(v.begin(), v.end());
    int c = 0; int idx = -1; int mc =  0;
    std::vector<T>::iterator il = v.begin();
    std::vector<T>::iterator im = v.begin();
    for(std::vector<T>::iterator it = v.begin(); it != v.end(); ++it)
    {
         if (!(*il < *it) && !(*it < *il) )
         {
             if (++c > mc)
             {
                  mc = c;
                  im = il;
             }
         }
         else
         {
              c = 1;
              il = it;
          }    
    }

    if (im != v.end()) t = *im;
    return mc;
}


int main()
{
    int a[] = { 4, 6, 3, 4, 2, 8, 3, 2, 3, 1, 0, 4, 1, 3, 2, 9, 7, 3 };
    vector<int> v(&a[0], &a[sizeof(a)/sizeof(int)]);
    vector<int>::iterator it;
    int c, r = -1;
    if ((c = occurs_mostoften(v.begin(), v.end(), r)) > 0)
    {
        std::cout << r << " : " << c << endl;
    }
    return 0;
}

0
 

Author Comment

by:Rothbard
ID: 18005090
Thanks to all who replied!
0

Featured Post

VIDEO: THE CONCERTO CLOUD FOR HEALTHCARE

Modern healthcare requires a modern cloud. View this brief video to understand how the Concerto Cloud for Healthcare can help your organization.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Update (December 2011): Since this article was published, the things have changed for good for Android native developers. The Sequoyah Project (http://www.eclipse.org/sequoyah/) automates most of the tasks discussed in this article. You can even fin…
This article shows you how to optimize memory allocations in C++ using placement new. Applicable especially to usecases dealing with creation of large number of objects. A brief on problem: Lets take example problem for simplicity: - I have a G…
The viewer will learn how to use the return statement in functions in C++. The video will also teach the user how to pass data to a function and have the function return data back for further processing.
The viewer will learn how to user default arguments when defining functions. This method of defining functions will be contrasted with the non-default-argument of defining functions.
Suggested Courses

972 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question