Możesz to prosto zrobić za pomocą std::map
bądź std::unordered_map
. Elementami będą pary (element wektora, ilość powtórzeń)
.
Krótki i trochę brzydki przykład:
#include <iostream>
#include <vector>
#include <algorithm>
#include <unordered_map>
template <typename T>
using CounterMap = std::unordered_map<T, std::size_t>;
int main() {
std::vector<int> vec = {1, 2, 3, 3, 2, 1, 1, 2, 3, 3};
CounterMap<int> counter;
for (int value : vec) {
++counter[value];
}
std::cout << max_element(counter.begin(),
counter.end(),
[](const CounterMap<int>::value_type &lhs,
const CounterMap<int>::value_type &rhs) {
return lhs.second < rhs.second;
})->first;
return 0;
}
http://ideone.com/rdo86s
std::unordered_map
to hashmapa (Tablica mieszająca :-D). Jest to tablica asocjacyjna w której trzymamy element wektora oraz liczbę powtórzeń. Element jest kluczem, więc może występować tylko raz. Przelatujemy cały wektor i zwiększamy licznik przy każdym elemencie - jeżeli go jeszcze nie ma zostanie dodany, bo tak działa operator[]
dla tego kontenera. Na koniec wyszukujemy który element ma najwyższą wartość licznika. Ponieważ elementami kontenera są tak naprawdę pary (std::pair
) trzeba napisać odpowiednią funkcję (tutaj funkcję lambda), która porówna wartości licznika.
Dokumentacja kontenera: http://www.cplusplus.com/reference/unordered_map/unordered_map/