dynamisches auswerten von Maximalwerten



  • Hallo

    Ich habe ein Problem, wozu ich auch nach ausführlicher Suche keine Lösung gefunden habe.

    Folgendes Problem:
    Ich habe ein Programm bei dem ein Array von Objekten generiert wurde. Nun soll eine Variable (Integer) der Objekte mit denen der jeweils anderen Objekten verglichen werden (aber nicht mit sich selbst). Dabei soll der Maximalste Wert herausgefunden werden, sowie die Nummer des Objektes im Array. Wenn es mehrere gibt, die den maximalen Wert enthalten, so soll eine bestimmte Aktion ausgeführt werden. Ebenso soll eine Aktion ausgeführt werden auf die Variable mit dem maximalsten Wert und eine Aktion auf alle Variablen, welche nicht den maximalen Wert haben.

    Ich habe bereits die Funktionen max und max_element gefunden, verstehe aber den Unterschied zwischen den beiden nicht. Kann mir jemand erklären worin der genaue Unterschied besteht und ob diese Funktionen für mein Problem helfen können?

    Danke

    Mfg
    Felix

    Edit:
    Das ganze soll dynamisch ausgelegt sein, also die größe des Array ist nicht festgelegt.


  • Mod

    max gibt dir den größten Wert aus den Werten, die du ihm als Argument gibst:

    max(1,6,2,7,3) == 7
    

    max_element gibt dir den größten Wert aus einer Reihe von Werten, wobei du ihm den Anfang und das Ende der Wertereihe als Argument gibst:
    int werte = {1,6,2,7,3};

    max_element(werte, werte + 5) == werte + 3
    


  • Vielen Dank für die Antwort.

    Gibt es auch eine Möglichkeit zu überprüfen ob der maximale Wert mehrmals in der Reihe vorkommt und wenn ja, wie oft und an welchen Stellen?

    Mfg
    Felix


  • Mod

    Das ist schon eine sehr spezielle Anforderung, das gibt es nicht mehr als fertige Funktion in der Standardbibliothek. Mir fällt auch keine effiziente Methode ein, dies aus den Algorithmen der Standardbibliothek zusammen zu setzen. Das würde ich einfach eben schnell selber programmieren, ungefähr 7 Zeilen sollten reichen. Da das schwer nach Hausaufgabe klingt, ist es vermutlich das Ziel der Aufgabe, dass du genau dies tust, anstatt einfach fertige Funktionen aufzurufen.



  • Danke für die Antwort.

    Es ist in gewisser Maßen Hausaufgabe. Das genannte Problem ist Teil eines größeren Projektes, allerdings gibt es keine Vorgaben wie es zu lösen ist. D.h. ich kann in dem Fall mit sämtlichen verfügbaren Funktionen arbeiten :).

    Mir ist gerade eine Idee zur Lösung gekommen und ich hab diese einfach mal notiert. Ich hoffe dass ich die max_element Funktion richtig eingesetzt habe und bitte darum, ob sich das jemand einmal anschauen könnte ob der code passt.

    int iMax, iGleich, iZähl;
    iGleich = 0;
    iMax = max_element(Objekt[0]->iWert, Objekt[Anzahl]->iWert);
    for(iZähl = 0; iZähl < Anzahl; iZähl ++)
    {
    	if(iGleich <= 1)
    	{
    		if(Objekt[iZähl]->iWert < iMax)
    		{ /* Führe Aktion aus*/}
    		else if(Objekt[iZähl]->iWert == iMax)
    		{ iGleich = iGleich + 1; // Herausfinden wie viele gleich sind}
    	}
    	else
    	{ /* mindestens zweimal der maximale Wert: Führe bestimmte Aktion aus*/ }
    }
    

    Vielen Dank
    Mfg
    Felix



  • Ne, das kompiliert doch nicht mal. max_element gibt dir einen Iterator auf das erste Vorkommen des größten Elements zurück. Außerdem möchte es gern zwei ForwardIteratoren als Argumente haben, optional noch etwas, mit dem es die vergleiche durchführen kann.

    Versuche doch, dein Problem auf Teilbereiche herunterzubrechen und die dann separat zu lösen:

    1. Bestimmen des Maximums
    2. Bestimmen der Anzahl der Maximalwerte
    3. Behandeln der einzelnen Wert

    Möglicherweise kann man Schritt 2) und 3) zusammenfassen.

    Edit:
    Du benutzt Variablen wie in C, in C++ sollte man Variablen so spät wie möglich einführen und, falls möglich, sofort initialisieren:

    // C
    size_t i;
    for( i = 0; i < xyz; ++i )
    {
    ...
    }
    
    // C++ 
    for( size_t i = 0; i < xxx; ++i )
    {
    }
    


  • Nein, dein Aufruf ist falsch, du mußt (da du anscheinend Objekte verwendest) die Version mit der Vergleichsfunktion (Compare) verwenden: max_element.



  • Vielen Dank euch beiden für die Antworten.

    Was genau ist denn ein Iterator? Ist das das gleiche wie ein Zeiger auf eine Adresse?

    Also an die Benutzung der Variablen in C++ muss ich mich noch bisschen gewöhnen. Ich verfalle schonmal in C zurück da ich erst kürzlich mit C++ angefangen habe 😉

    Die Vergleichsfunktion hab ich schonmal gesehen. Die gibt doch nur zurück ob zwei Variablen gleich sind oder nicht oder?

    Mfg
    Felix



  • felix1234 schrieb:

    Was genau ist denn ein Iterator? Ist das das gleiche wie ein Zeiger auf eine Adresse?

    Ein Iterator ist ein Konzept, dass z.B. durch einen Pointer erfüllt wird. Es gibt aber auch Datenstrukturen (Linked Lists, Bäume) wo man mit einem einfachen ptr++ nicht durch alle Elemente iterieren kann. Hier ist der Iterator nicht nur ein einfacher Pointer, verhält sich aber so ähnlich (man kann mit it++ zum nächsten Element gehen und *it liefert den Wert an der aktuellen Position, usw.). Quasi alle Algorithmen in der STL arbeiten mit Iteratoren und geben teilweise auch solche zurück, wie auch die max_element Funktion.

    felix1234 schrieb:

    Die Vergleichsfunktion hab ich schonmal gesehen. Die gibt doch nur zurück ob zwei Variablen gleich sind oder nicht oder?

    Die max_element soll ja das Maximum der Elemente finden. Aber was ist das Maximum wenn die Elemente structs sind? Manchmal hat man einen operator< für structs definiert, dann kann man auch mit max_element das Maximum suchen. Deine Definition von Maximum ist dann, dass ein bestimmte Membervariable maximal wird. Ob man das als operator< ins struct packen will ist fraglich, da man eventuell später mal das Maxmium einer anderen Membervariable suchen möchte. Also gibst du max_element eine Compare Funktion welche als Parameter deine Objekte hat und dann die gewünschte Membervariable vergleicht.


Log in to reply