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
Хвала.
Проверио сам, ради еквивалентан код.