krótsze algo do znajdywania

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

2011-10-08 15:48
Rev
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

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

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

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

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

Liczba odpowiedzi na stronę

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