Wie kann ich den Maximalwert (oder Minimalwert) in einem Vektor ermitteln?

123

Wie kann ich den Maximalwert (oder Minimalwert) in einem Vektor in C ++ ermitteln ?

Ich habe bei Google einige Lösungen dafür gesehen, aber keine davon ergab für mich einen Sinn :(

Kann jemand auf einfache und unkomplizierte Weise erklären, wie man den Maximal- oder Minimalwert von einem Vektor erhält? und irre ich mich, wenn ich annehme, dass es mit einem Array mehr oder weniger dasselbe wäre?

Ich brauche einen Iterator, oder? Ich habe es mit versucht, max_elementaber immer wieder einen Fehler bekommen?

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

Fehler: Anforderung für Mitglied 'begin' in 'cloud', das vom Nicht-Klassentyp 'int [10]' ist.

EDIT: Ich konnte meine eigenen nicht beantworten ??? also werde ich es hier setzen ...

Wow, danke für die schnellen Antworten! Ich habe es so gemacht, denkst du, es ist in Ordnung?

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

wo cdfist ein Vektor.

Bob Blob
quelle
Sieht so aus, als wäre cloudes kein STL-Container, sondern ein int[10]. Grundsätzlich cloudhat kein Mitglied .begin(). Vielleicht möchten Sie ein einfaches C ++ - Buch erhalten, es sei denn, Sie tun nur diese eine Sache.
Chris A.
Etwas mehr Code könnte ebenfalls nützlich sein. Wo ist die Definition von Cloud?
Tim
9
@bobblob: und doch sagte der von Ihnen gepostete Compilerfehler, dass "Cloud nicht vom Klassentyp ist int[10]". Wie kann es dann ein Vektor sein?
Jalf

Antworten:

118

Mit c ++ 11 / c ++ 0x-Kompilierungsflags können Sie

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

Ansonsten schreiben Sie Ihre eigenen:

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

Sehen Sie es live unter 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';
}

Oh, und verwendenstd::minmax_element(...) Sie, wenn Sie beide gleichzeitig benötigen: /

sehe sehen
quelle
Hallo, wissen Sie, ob es möglich ist, es auf ein Dimensionsarray oder einen Vektor anzuwenden?
Charles Chow
3
Ja, du kannst. Die Standardbibliotheksalgorithmen wurden entwickelt, um generisch mit Iteratoren zu arbeiten. Zeiger sind auch Iteratoren.
sehe
85

Wenn Sie die Funktion verwenden möchten, std::max_element()müssen Sie Folgendes tun:

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

Ich hoffe das kann helfen.

Angie Quijano
quelle
10
Warum gibt es *in *max_element?
Konrad
39
Das liegt daran, dass ´max_element´ einen Iterator zurückgibt
Angie Quijano
Ich denke, Sie haben angenommen, dass die Eingabe Vektor <double> ist oder dass * max_element () standardmäßig double val zurückgibt.
Sameer Kape
14

Lassen,

 #include <vector>

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

Wenn der Vektor in aufsteigender oder absteigender Reihenfolge sortiert ist, können Sie ihn mit der Komplexität O (1) finden.

Für einen Vektor aufsteigender Reihenfolge ist das erste Element das kleinste Element. Sie können es durch v [0] (0-basierte Indizierung) erhalten, und das letzte Element ist das größte Element. Sie können es durch v [sizeOfVector-1] erhalten.

Wenn der Vektor in absteigender Reihenfolge sortiert ist, ist das letzte Element das kleinste Element. Sie können es mit v [sizeOfVector-1] und das erste Element mit dem größten Element abrufen. Sie können es mit v [0] abrufen.

Wenn der Vektor nicht sortiert ist, müssen Sie über den Vektor iterieren, um das kleinste / größte Element zu erhalten. In diesem Fall ist die Zeitkomplexität O (n), hier ist n die Größe des Vektors.

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];
    }
}

Sie können Iterator verwenden,

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

Sie können es im Eingabeabschnitt berechnen (wenn Sie das kleinste oder größte Element aus einem bestimmten Vektor finden müssen).

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);
}

Sie können auch das kleinste / größte Element durch integrierte Funktionen erhalten

#include<algorithm>

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

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

Mit diesen Funktionen können Sie das kleinste / größte Element eines beliebigen Bereichs erhalten. sowie,

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)

Ich habe Sternchen (*) vor den Funktionen min_element () / max_element () verwendet. Weil beide den Iterator zurückgeben. Alle Codes sind in c ++.

Taohidul Islam
quelle
2
min_elementund max_elementgeben Sie einen Iterator zurück , keinen Zeiger. Um technisch korrekt zu sein, ist ein Zeiger jedoch eine Teilmenge eines Iterators. Siehe: stackoverflow.com/questions/2728190/…
Rayryeng
Ich habe meine Antwort aktualisiert. Vielen Dank für Ihre Beobachtung.
Taohidul Islam
9

Angenommen, Cloud ist, dass int cloud[10]Sie es so machen können: int *p = max_element(cloud, cloud + 10);

Asha
quelle
Ich werde es auch versuchen. Ich habe früher versucht, max_element zu bekommen, aber keine Liebe. Vielen Dank!
Bob Blob
7

Sie können es direkt mit der Funktion max_element / min_element drucken. Z.B:

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

  cout<<*min_element(v.begin(),v.end());
Kishy Nivas
quelle
5

In c ++ 11 können Sie folgende Funktionen verwenden:

int maxAt(std::vector<int>& vector_name) {
    int max = INT_MIN;
    for (auto val : vector_name) {
         if (max < val) max = val;
    }
    return max;
}
brenorodrigues
quelle
Da Sie auf C ++ 11 verweisen, ist dies besser als die Verwendung, std::max_elementweil ...?
Rayryeng
1

Wenn Sie einen Iterator verwenden möchten, können Sie eine neue Platzierung mit einem Array durchführen.

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

Beachten Sie das Fehlen eines ()am Ende, das ist wichtig. Dadurch wird eine Array-Klasse erstellt, die diesen Speicher als Speicher verwendet und über STL-Funktionen wie Iteratoren verfügt.

(Dies ist übrigens C ++ TR1 / C ++ 11)

std''OrgnlDave
quelle
1

Mit max_element können Sie den Maximalwert in vector ermitteln. Das max_element gibt einen Iterator auf den größten Wert im Bereich zurück oder zuletzt, wenn der Bereich leer ist. Da ein Iterator wie Zeiger ist (oder Sie können sagen, dass der Zeiger eine Form des Iterators ist), können Sie ein * davor verwenden, um den Wert abzurufen. Entsprechend dem Problem können Sie das maximale Element in einem Vektor erhalten als:

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

Es gibt Ihnen das maximale Element in Ihrem Vektor "Wolke". Ich hoffe es hilft.

Prashant Shubham
quelle
0

Nur das:

// 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
quelle
Warum Makros verwenden? Dafür gibt es keinen Grund! Der Fehler beginnt mit int cloud[10];und es ist die Verwendung von magischen Zahlen.
Ulrich Eckhardt
1
Denn aus der Fehlermeldung geht hervor, dass er keinen Vektor, sondern ein normales Array hat. Und man muss seine Länge irgendwie zählen, um die Verwendung von hartcodierten magischen Zahlen zu vermeiden. Er kann in Zukunft die Länge ändern, aber der Code zum Finden des Maximums auf diese Weise ist der gleiche.
ivan.ukr
Entschuldigung, das ist nicht richtig rübergekommen. Ihre Lösung ist richtig, aber schlecht. Der Grund ist, dass die Verwendung magischer Zahlen vorausgesetzt wird, die sich nicht aus der Fehlermeldung ergeben. Anschließend werden Makros verwendet, die immer nach Code riechen.
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);
}

Der komplette Nooby-Weg ... in C.

user3907370
quelle
3
Dies beantwortet die Frage, wie man den Maximalwert in einem Array findet, nicht in einem C ++vector
Andrew Stubbs
Diese Frage ist mit C ++ gekennzeichnet. Sie haben diesen Code in C geschrieben, aber nicht nur das, Sie setzen einen Vektor einem Array gleich - nicht korrekt. Sie haben auch unnötige Druckanweisungen, wenn wir nur den tatsächlichen Wert benötigen. Schließlich lenkt der gesamte Code ab. Sie brauchen nur den Code in der forSchleife. Insgesamt eine sehr schlechte Antwort.
Rayryeng