Jak uzyskać maksymalną (lub minimalną) wartość w wektorze?

124

Jak uzyskać maksymalną (lub minimalną) wartość w wektorze w C ++ ?

Widziałem kilka rozwiązań tego problemu w Google, ale żadne z nich nie miało dla mnie sensu :(

Czy ktoś może wyjaśnić w prosty i prosty sposób noob, jak uzyskać maksymalną lub minimalną wartość z wektora? i czy mylę się zakładając, że byłoby mniej więcej tak samo z tablicą?

Potrzebuję iteratora, prawda? Próbowałem, max_elementale nadal wyświetlał się błąd?

vector<int>::const_iterator it;
it = max_element(cloud.begin(), cloud.end());

błąd: żądanie elementu „rozpoczyna się” w „chmurze”, które nie jest typu „int [10]”

EDYCJA: nie byłem w stanie odpowiedzieć na własne ??? więc wstawię to tutaj ...

Wow, dzięki za szybkie odpowiedzi! Skończyło się na tym, że zrobiłem to w ten sposób, czy myślisz, że to w porządku?

for (unsigned int i = 0; i < cdf.size(); i++)
  if (cdf[i] < cdfMin)
    cdfMin = cdf[i];

gdzie cdfjest wektor.

bob blob
źródło
Wygląda na cloudto, że nie jest to kontener STL, ale raczej plik int[10]. Zasadniczo cloudnie ma członka .begin(). Może chcesz zdobyć podstawową książkę C ++, chyba że robisz tylko jedną rzecz.
Chris A.
Może się przydać również trochę więcej kodu. Gdzie jest definicja chmury?
Tim
9
@bobblob: a mimo to błąd kompilatora, który opublikowałeś, mówił, że „chmura nie jest typu int[10]”. Jak więc może to być wektor?
jalf

Odpowiedzi:

119

Używając flag kompilacji c ++ 11 / c ++ 0x, możesz

auto it = max_element(std::begin(cloud), std::end(cloud)); // c++11

W przeciwnym razie napisz własne:

template <typename T, size_t N> const T* mybegin(const T (&a)[N]) { return a; }    
template <typename T, size_t N> const T* myend  (const T (&a)[N]) { return a+N; }

Zobacz to na żywo na http://ideone.com/aDkhW :

#include <iostream>
#include <algorithm>

template <typename T, size_t N> const T* mybegin(const T (&a)[N]) { return a; }    
template <typename T, size_t N> const T* myend  (const T (&a)[N]) { return a+N; }

int main()
{
    const int cloud[] = { 1,2,3,4,-7,999,5,6 };

    std::cout << *std::max_element(mybegin(cloud), myend(cloud)) << '\n';
    std::cout << *std::min_element(mybegin(cloud), myend(cloud)) << '\n';
}

Aha, i użyj,std::minmax_element(...) jeśli potrzebujesz obu naraz: /

sehe
źródło
Cześć, czy wiesz, czy można go zastosować do tablicy wymiarów lub wektora?
Charles Chow
3
Tak, możesz. Algorytmy biblioteki standardowej zostały zaprojektowane tak, aby generalnie działały na iteratorach. Wskaźniki są również iteratorami.
sehe
85

Jeśli chcesz korzystać z funkcji std::max_element(), musisz to zrobić:

double max = *max_element(vector.begin(), vector.end());
cout<<"Max value: "<<max<<endl;

Mam nadzieję, że to pomoże.

Angie Quijano
źródło
10
Dlaczego jest *w środku *max_element?
Konrad
39
Dzieje się tak, ponieważ „max_element” zwraca iterator
Angie Quijano,
Wydaje mi się, że założyłeś, że dane wejściowe to wektor <double> lub * max_element () domyślnie zwraca wartość double.
Sameer Kape
14

Pozwolić,

 #include <vector>

 vector<int> v {1, 2, 3, -1, -2, -3};

Jeśli wektor jest posortowany w porządku rosnącym lub malejącym, to można go znaleźć ze złożonością O (1).

Dla wektora w kolejności rosnącej pierwszy element jest najmniejszym elementem, można go uzyskać za pomocą v [0] (indeksowanie oparte na 0), a ostatni element jest największym elementem, można go uzyskać za pomocą v [sizeOfVector-1].

Jeśli wektor jest posortowany w kolejności malejącej, to ostatnim elementem jest najmniejszy element, można go uzyskać za pomocą v [sizeOfVector-1], a pierwszy element jest największym elementem, można go uzyskać za pomocą v [0].

Jeśli wektor nie jest posortowany, musisz iterować po wektorze, aby uzyskać najmniejszy / największy element. W tym przypadku złożoność czasowa wynosi O (n), tutaj n jest rozmiarem wektora.

int smallest_element = v[0]; //let, first element is the smallest one
int largest_element = v[0]; //also let, first element is the biggest one
for(int i = 1; i < v.size(); i++)  //start iterating from the second element
{
    if(v[i] < smallest_element)
    {
       smallest_element = v[i];
    }
    if(v[i] > largest_element)
    {
       largest_element = v[i];
    }
}

Możesz użyć iteratora,

for (vector<int>:: iterator it = v.begin(); it != v.end(); it++)
{
    if(*it < smallest_element) //used *it (with asterisk), because it's an iterator
    {
      smallest_element = *it;
    }
    if(*it > largest_element)
    {
      largest_element = *it;
    }
}

Możesz to obliczyć w sekcji wejściowej (gdy musisz znaleźć najmniejszy lub największy element z danego wektora)

int smallest_element, largest_element, value;
vector <int> v;
int n;//n is the number of elements to enter
cin >> n;
for(int i = 0;i<n;i++)
{
    cin>>value;
    if(i==0)
    {
        smallest_element= value; //smallest_element=v[0];
        largest_element= value; //also, largest_element = v[0]
    }

    if(value<smallest_element and i>0)
    {
        smallest_element = value;
    }

    if(value>largest_element and i>0)
    {
        largest_element = value;
    }
    v.push_back(value);
}

Możesz również uzyskać najmniejszy / największy element dzięki wbudowanym funkcjom

#include<algorithm>

int smallest_element = *min_element(v.begin(),v.end());

int largest_element  = *max_element(v.begin(),v.end());

Korzystając z tej funkcji, możesz uzyskać najmniejszy / największy element z dowolnego zakresu. Jak na przykład,

vector<int> v {1,2,3,-1,-2,-3};

cout << *min_element(v.begin(), v.begin() + 3); //this will print 1,smallest element of first three elements

cout << *max_element(v.begin(), v.begin() + 3); //largest element of first three elements

cout << *min_element(v.begin() + 2, v.begin() + 5); // -2, smallest element between third and fifth element (inclusive)

cout << *max_element(v.begin() + 2, v.begin()+5); //largest element between third and first element (inclusive)

Użyłem gwiazdki (*) przed funkcjami min_element () / max_element (). Ponieważ obaj zwracają iterator. Wszystkie kody są w języku C ++.

Taohidul Islam
źródło
2
min_elementi max_elementzwraca iterator , a nie wskaźnik. Jednak aby być technicznie poprawnym, wskaźnik jest podzbiorem iteratora. Zobacz: stackoverflow.com/questions/2728190/…
rayryeng
Zaktualizowałem moją odpowiedź. Dziękuję za uwagę.
Taohidul Islam
9

Zakładając chmurę int cloud[10], możesz to zrobić w ten sposób: int *p = max_element(cloud, cloud + 10);

Asha
źródło
spróbuję też tego. Próbowałem wcześniej uzyskać max_element, ale bez miłości. dzięki!
bob blob
7

Możesz go wydrukować bezpośrednio za pomocą funkcji max_element / min_element. Na przykład:

  cout<<*max_element(v.begin(),v.end());

  cout<<*min_element(v.begin(),v.end());
Kishy Nivas
źródło
5

W C ++ 11 możesz użyć takiej funkcji:

int maxAt(std::vector<int>& vector_name) {
    int max = INT_MIN;
    for (auto val : vector_name) {
         if (max < val) max = val;
    }
    return max;
}
brenorodrigues
źródło
Ponieważ odwołujesz się do C ++ 11, jest to lepsze niż używanie, std::max_elementponieważ ...?
rayryeng
1

Jeśli chcesz użyć iteratora, możesz zrobić miejsce-nowy z tablicą.

std::array<int, 10> icloud = new (cloud) std::array<int,10>;

Zwróć uwagę na brak () na końcu, to ważne. Tworzy to klasę tablicową, która używa tej pamięci jako swojej pamięci i ma funkcje STL, takie jak iteratory.

(Nawiasem mówiąc, to jest C ++ TR1 / C ++ 11)

std''OrgnlDave
źródło
1

Możesz użyć max_element, aby uzyskać maksymalną wartość w wektorze. Element max_element zwraca iterator do największej wartości w zakresie lub ostatniego, jeśli zakres jest pusty. Ponieważ iterator jest podobny do wskaźników (lub możesz powiedzieć, że wskaźnik jest formą iteratora), możesz użyć znaku * przed nim, aby uzyskać wartość. Więc zgodnie z problemem możesz uzyskać maksymalny element w wektorze jako:

int max=*max_element(cloud.begin(), cloud.end());

To da ci maksymalny pierwiastek w twojej wektorowej "chmurze". Mam nadzieję, że to pomoże.

Prashant Shubham
źródło
0

Tylko to:

// assuming "cloud" is:
// int cloud[10]; 
// or any other fixed size

#define countof(x) (sizeof(x)/sizeof((x)[0]))

int* pMax = std::max_element(cloud, cloud + countof(cloud));
ivan.ukr
źródło
Po co używać makr? Nie ma powodu! Błąd zaczyna się od int cloud[10];i jest to użycie magicznych liczb.
Ulrich Eckhardt
1
Ponieważ z komunikatu o błędzie wynika, że ​​ma on nie wektor, ale zwykłą tablicę. I musisz jakoś policzyć jego długość, aby uniknąć używania zakodowanych na stałe magicznych liczb. W przyszłości może zmienić długość, ale kod do znalezienia maksimum w ten sposób będzie taki sam.
ivan.ukr
Przepraszamy, to nie wyszło poprawnie. Twoje rozwiązanie jest poprawne, ale złe. Powodem jest to, że zakłada użycie liczb magicznych, co nie wynika z komunikatu o błędzie. Następnie jest kontynuowany przy użyciu makr, które zawsze są zapachem kodu.
Ulrich Eckhardt
-5
#include <stdlib.h>
#include <stdio.h>

int main()
{

    int vector[500];

    vector[0] = 100;
    vector[1] = 2;
    vector[2] = 1239;
    vector[3] = 5;
    vector[4] = 10;
    vector[5] = 1;
    vector[6] = 123;
    vector[7] = 1000;
    vector[8] = 9;
    vector[9] = 123;
    vector[10] = 10;

    int i = 0;

    int winner = vector[0];

    for(i=0;i < 10; i++)
    {
        printf("vector = %d \n", vector[i]);

        if(winner > vector[i])
        {
            printf("winner was %d \n", winner);
            winner = vector[i];
            printf("but now is %d \n", winner);
        }
    }

    printf("the minimu is %d", winner);
}

Absolutnie nooby ... w C.

user3907370
źródło
3
Odpowiada to na pytanie, jak znaleźć maksymalną wartość w tablicy, a nie w C ++vector
Andrew Stubbs
To pytanie jest oznaczone jako C ++. Napisałeś ten kod w C, ale nie tylko, zrównujesz wektor z tablicą - nieprawidłowo. Masz również niepotrzebne instrukcje drukowania, gdy potrzebujemy tylko rzeczywistej wartości. Wreszcie cały kod jest rozpraszający. Potrzebujesz tylko kodu w forpętli. Ogólnie bardzo słaba odpowiedź.
rayryeng