Czy jest funkcja w c++ wypisująca najczęściej występujący element w tablicy, wektorze, stringu?
0
5
Nie ma, ale można łatwo napisać:
// To jest template alias.
// Pozwala latwo dobrac sie do typu na jaki wskazuje iterator.
template <typename InputIt>
using InputItValue = typename std::iterator_traits<InputIt>::value_type;
template <typename InputIt>
InputItValue<InputIt> mostFrequent(InputIt begin, InputIt end) {
// Do zliczana uzyjemy mapy, w ktorej kluczem beda elementy z podanego zakresu
// a wartoscia ilosc wystapien.
std::unordered_map<InputItValue<InputIt>, std::size_t> value_map;
// Iterujemy po wszystkich elementach w zakresie [begin, end)
for (InputIt it = begin; it != end; ++it) {
// Dodajemy do mapy elementy oraz inkrementujemy licznik
++value_map[*it];
}
// To jest po to, zeby nie pisac za duzo.
// Potrzebujemy typu jaki przechowuje mapa.
// decltype "wyciaga" typ z podanej zmienej, zeby nie powtarzac znow rozwleklego typu mapy.
typedef typename decltype(value_map)::value_type MapPair;
// Szukamy maksymalnego licznika w mapie i zwracamy zwiazany z nim element.
return std::max_element(value_map.begin(),
value_map.end(),
// Zeby znalezc ten licznik trzeba patrzec na drugi element pary z mapy.
[](const MapPair &rhs, const MapPair &lhs) {
return rhs.second < lhs.second;
})->first;
}
:-D