zliczanie poszczególnych elementów w vectorze

0

Witam,

Na potrzeby zadania programistycznego muszę znaleźć sposób na wybranie najczęściej i najrzadziej pojawiającego się elementu vectora. Elementami są wskaźniki do obiektów. Czy da się to jakoś sensownie zrobić i ewentualnie jak?

Będę wdzięczny za pomoc.

2

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/

0

hm. w ogóle nie rozumiem co się w tym kodzie dzieje. Niestety nigdy nie miałem sposobności korzystać z hashmapy.
Wielkie dzięki za pomoc.

ps. kod skopiowałem do visuala i mi wywala błąd. tak powinno być ?

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