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
FelixEdit:
Das ganze soll dynamisch ausgelegt sein, also die größe des Array ist nicht festgelegt.
-
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
-
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 zweiForwardIteratoren
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:
- Bestimmen des Maximums
- Bestimmen der Anzahl der Maximalwerte
- 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 einenoperator<
für structs definiert, dann kann man auch mitmax_element
das Maximum suchen. Deine Definition von Maximum ist dann, dass ein bestimmte Membervariable maximal wird. Ob man das alsoperator<
ins struct packen will ist fraglich, da man eventuell später mal das Maxmium einer anderen Membervariable suchen möchte. Also gibst dumax_element
eine Compare Funktion welche als Parameter deine Objekte hat und dann die gewünschte Membervariable vergleicht.