Funkcja wypisująca najczęściej występujący element w tablicy, wektorze lub stringu

0

Czy jest funkcja w c++ wypisująca najczęściej występujący element w tablicy, wektorze, stringu?

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;
}

http://ideone.com/xH6irJ

:-D

1 użytkowników online, w tym zalogowanych: 0, gości: 1