krótsze algo do znajdywania

gubbi
2011-10-08 15:42
gubbi
0

http://ideone.com/RJZb4
potrzebuję jakiś krótszy algorytm w c++. program ma znaleźć nawiększą liczbe spośród wprowadzonych liczb.

Pozostało 580 znaków

Rev
2011-10-08 15:48
Rev
Moderator

Rejestracja: 12 lat temu

Ostatnio: 3 godziny temu

0

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.


c++ golf: max_element(istream_iterator<int> (cin),istream_iterator<int>()) - Zjarek 2011-10-08 18:05

Pozostało 580 znaków

gubbi
2011-10-08 16:01
gubbi
0

Dzięki @Rev o to mi chodziło teraz mam krótszy kod o parę linijek :)

Pozostało 580 znaków

gubbi
2011-10-08 22:44
gubbi
0
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.

Jeżeli rozumiesz wskaźniki to first zachowuje się jak wskaźnik do pierwszego elementu, a last do pierwszego elementu za ostatnim. Funkcje operujące na iteratorach gdy "nie działają" zwykle zwracają iterator właśnie do tego pierwszego elementu za ostatnim (np. wyszukiwanie). Spróbuj samemu napisać funkcję która dostaje dwa wskaźniki i zwróci wskaźnik do największego elementu ze zbioru [first,last) i porównaj z tą. - Zjarek 2011-10-08 22:57

Pozostało 580 znaków

gubbi
2011-10-09 00:52
gubbi
0

Rozumiem wskaźniki, ale nie rozumiem tego zdania..

, a last do pierwszego elementu za ostatnim.

Pozostało 580 znaków

2011-10-09 01:12

Rejestracja: 8 lat temu

Ostatnio: 6 lat temu

0

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'.

Pozostało 580 znaków

gubbi
2011-10-09 13:41
gubbi
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.

Nie chodzi o sprawdzenie adresu, tylko elementu pod adresem. Przecież musisz znaleźć największy element, a nie element o największym adresie. - Zjarek 2011-10-10 02:13

Pozostało 580 znaków

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