Question: I have a vector with integers. I would like to select the most common numbers. I would like to make a top 5 list. For example:

```
std::vector<int> numbers = {32, 32, 32, 12, 12, 11, 11, 11, 9};

```

the most common numbers are: TOP 1: 32, TOP 2: 11, TOP 3: 12, TOP 4: 9;

after I selected them, I would like to store it into an other vector: the most common numbers.

Answer: 
You can create a `unordered_map<int,int> mp` where you can store the count of each number, like `mp[32] = 3`. 

Next you need to find the top five elements

1. **Time Complexity : O(mlogm)** : You can sort the map in descending order( to sort it you will have to use a extra vector), and take the first 5 elements.
2. **Time Complexity: O(m)** : Or you can iterate 5 times over the whole map to get the top file elements. Each time you iterate find the number with the greatest frequency which is not present in our topFive vector yet.

m : number of entries in the map.
There are many many ways how to achieve this. One of which may be.

```
std::vector numbers = {32, 32, 32, 12, 12, 11, 11, 11, 9};
int maxNumber = *std::max_element(numbers.begin(), numbers.end())
std::vector<int> occurrences(maxNumber + 1, 0);
for(auto& value : numbers)
{
   occurrences[value]++;
}

```

Then you just need to sort the array whilst keeping track of the indexes. This is a topic of another question [C++ sorting and keeping track of indexes](https://stackoverflow.com/questions/1577475/c-sorting-and-keeping-track-of-indexes).