http://ideone.com/RJZb4
potrzebuję jakiś krótszy algorytm w c++. program ma znaleźć nawiększą liczbe spośród wprowadzonych liczb.
std::max_element
zwraca wskaźnik do największego elementu w zbiorze. Jako argumenty podajesz początek i koniec zbioru, w przypadku tablicy początek to po prostu jej nazwa, a ostatni to nazwa + ilość_elementów.
Dzięki @Rev o to mi chodziło teraz mam krótszy kod o parę linijek :)
template <class ForwardIterator>
ForwardIterator max_element ( ForwardIterator first, ForwardIterator last )
{
ForwardIterator largest = first;
if (first==last) return last;
while (++first!=last)
if (*largest<*first)
largest=first;
return largest;
}
Mógłby ktoś mi objaśnić o co chodzi w każdej linii? Nie bardzo wiem dleczego w warunku if first jest porównywane z last i jeśli będzie równy pierwszy i ostatni element to zwróci ostatni? Np. 1, 2, 1 - to według tego warunku powinno zwrócić 1, ale max element to 2.
Rozumiem wskaźniki, ale nie rozumiem tego zdania..
, a last do pierwszego elementu za ostatnim.
Przykładowo dla tablicy int tab[3]={1,2,3} tab jest początkiem (first), a tab+3 końcem (last). Samo tab+3 wskazuje na element za tablicą. Gdybyś iterował po C stringu, używając tego idiomu mógłbyś pominąć podawanie wskaźnika last, wystarczyłoby testowanie czy wartość na danym miejscu jest równa '\0'.
okay, teraz czaję.
template <class ForwardIterator>
ForwardIterator max_element ( ForwardIterator first, ForwardIterator last )
{
ForwardIterator largest = first;
if (first==last) return last;
while (++first!=last)
if (largest<first)
largest=first;
return largest;
}
W orginalu w drugim warunku jest if (*largest<*first), właściwie zastanawiam się, czy poprawny jest zapis if (largest<first)? Wydaje mi się, że tak bo sprawdzamy adresy pod którymi znajdują się zmienne. Proszę o opinie.