Strelica i &

Pitanje ili opis problema

Nije mi jasna poslednja naredba u resenju

#include <iostream>
#include <string>
#include <map>
#include <algorithm>

using namespace std;

int main() {
  int n;
  cin >> n;

  // ucitavamo niske i racunamo broj pojavljivanja svake od njih
  map<string, int> brojPojavljivanja;
  for (int i = 0; i < n; i++) {
    string x; cin >> x;
    brojPojavljivanja[x]++;
  }

  // odredjujemo onu sa maksimalnim brojem pojavljivanja
  cout << max_element(begin(brojPojavljivanja), end(brojPojavljivanja),
                      [](auto& p1, auto& p2) {
                        return p1.second < p2.second;
                      })->second << endl;
}

To je celo rešenje a meni ovo posle cout nije jasno. Pretpostavljam da begin i end sortiraju brojPojavljivanja.

Link ka zadatku ili odgovarajućoj stranici

https://petlja.org/biblioteka/r/Zbirka2/najbrojniji_element1

std::max_element funkcija vraća iterator do maksimuma nekog niza ako joj je dat iterator do početka (ovde dat preko std::begin) i kraja niza (ovde dat preko std::end), i opcionalni treći argument koji predstavlja funkciju za poređenje dva elementa. Ne dešava se nikakvo sortiranje niza.

Sintaksa [](argumenti){kod} predstavlja lambda funkciju, koje se u ovom slučaju koriste samo kao skraćeni način pisanja neke funkcije (ta funkcija je mogla biti definisana i van main-a pa prosleđena std::max_element preko imena). auto označava da se tip argumenta lambda funkcije automatski određuje a & označava da se radi o referenci na neki tip (ovde verujem da služi da se argument lambda funkcije, odnosno par koji predstavlja unos mape, ne bi kopirao na stek prilikom prosleđivanja funkciji i tako usporavao program, tako da će se koristiti već postojeći unos mape u memoriji prilikom njihovog poređenja).

Iterator za std::map (izgleda) ima preklopljen -> operator (on obično služi za pristupanje poljama neke klase ili strukture preko pokazivača na tu klasu ili strukturu) tako da njegovim korišćenjem nad iteratorom koji nam je vratio std::max_element dobijamo par std::pair<std::string, int> koji predstavlja unos naše mape sa najvećim elementom, i pristupanjem second polju para (drugom elementu našeg para, odnosno broju ponavljanja niske) dobijamo največi broj ponavljanja neke unete niske.

Trebalo bi da je ovaj kod iznad funkcionalno ekvivalentan (barem u smislu da prolazi sve test primere):

int maxel = 0;
for (auto it = brojPojavljivanja.begin(); it != brojPojavljivanja.end(); ++it) {
    if (it->second > maxel) {
        maxel = it->second;
    }
}
cout << maxel << endl;
1 Like

Хвала.
Проверио сам, ради еквивалентан код.