vektorfeder vertauschen
-
Das Maximum kannst du einfacher bestimmen, zum Beispiel so:
double Max(const vector<double> &v) { double max = std::numeric_limits<double>::min(); for ( size_t i = 0; i < v.size(); ++i ) max = std::max( max, v[i] ); return max; }
-
icarus2 schrieb:
Das Maximum kannst du einfacher bestimmen, zum Beispiel so:
double Max(const vector<double> &v) { double max = std::numeric_limits<double>::min(); for ( size_t i = 0; i < v.size(); ++i ) max = std::max( max, v[i] ); return max; }std::max_element?
-
Was passiert, wenn der Vektor kein Element enthaelt?
-
template<typename Iterator> Iterator max(Iterator begin, Iterator end) { Iterator result = begin; for(; begin != end; ++begin) if(*begin > *result) result = begin; return result; }So wäre meine Idee.
-
Ethon schrieb:
So wäre meine Idee.
Spätestens nach SeppJ's Beitrag ätte deine Idee eine andere sein sollen:
double Max(const vector<double> &v){ if (v.empty()) throw std::logic_error("No maximum in empty container!"); return *max_element(begin(v), end(v)); }Wobei die Fehlerbehandlung Geschmackssache und auch kontextabhängig ist.
-
ist die max_element eine vordefinierte funktion? Wenn ich das so versuche wirft er mir mehrere fehlermeldungen raus beim kompilieren:
a5.cpp: In function ‘double Max(const std::vector<double>&)’: a5.cpp:8:24: error: ‘logic_error’ is not a member of ‘std’ a5.cpp:9:30: error: ‘begin’ was not declared in this scope a5.cpp:9:38: error: ‘end’ was not declared in this scope a5.cpp:9:39: error: ‘max_element’ was not declared in this scope
-
du musst natürlich den entsprechenden Header einbinden... ich weiß leider gerade nicht, welcher das ist. Google hilft dir da bestimmt weiter

-
Ich glaub <algorithm>.
gruß
syntax
-
Namal schrieb:
ist die max_element eine vordefinierte funktion?
Jap.
a5.cpp:8:24: error: ‘logic_error’ is not a member of ‘std’Google doch mal nach logic_error. Blindes Kopieren bringt dir keinen Lerneffekt.
a5.cpp:9:30: error: ‘begin’ was not declared in this scope a5.cpp:9:38: error: ‘end’ was not declared in this scopeOk, du scheinst einen älteren Compiler zu nutzen, wo es std::begin noch nicht gibt. Nutze v.begin() und v.end() statt dessen.
a5.cpp:9:39: error: ‘max_element’ was not declared in this scopeGoogle doch mal nach max_element. Blindes Kopieren bringt dir keinen Lerneffekt.
-
pumuckl schrieb:
Google doch mal nach logic_error. Blindes Kopieren bringt dir keinen Lerneffekt.
Google doch mal nach max_element. Blindes Kopieren bringt dir keinen Lerneffekt.

-
Ok, also mit max_element hat es geklappt, was macht eigentlich das sternchen davor?
Allerdings wollte ich das mit meiner idee weiter probieren, also hab ich es so verändert
double Max(const vector<double> &v){ vector <double> a(v.size()); for (int k=0; k<v.size(); ++k) a[k]=v[k]; for (int l=0; l<a.size(); ++l){ if (a[l]>a[l+1]) a[l+1]=a[l]; } return a[a.size()-1]; }Also den vekto einfach in einen anderen umschreiben und dann vertauschen. Jetzt wird es auch ohne Probleme kompiliert, beim ausführen, nachdem man dann die letzte zahl eingegeben hat stürzt das programm aber ab

*** glibc detected *** ./a5: free(): invalid next size (fast): 0x08eb2068 ***
-
Namal schrieb:
Ok, also mit max_element hat es geklappt, was macht eigentlich das sternchen davor?
Allerdings wollte ich das mit meiner idee weiter probieren, also hab ich es so verändert
double Max(const vector<double> &v){ vector <double> a(v.size()); for (int k=0; k<v.size(); ++k) a[k]=v[k]; for (int l=0; l<a.size(); ++l){ if (a[l]>a[l+1]) a[l+1]=a[l]; } return a[a.size()-1]; }Also den vekto einfach in einen anderen umschreiben und dann vertauschen. Jetzt wird es auch ohne Probleme kompiliert, beim ausführen, nachdem man dann die letzte zahl eingegeben hat stürzt das programm aber ab

*** glibc detected *** ./a5: free(): invalid next size (fast): 0x08eb2068 ***
Wie lernst du eigentlich? Wenn du kein Buch hast, würde ich mir eins Kaufen. Empfehlungen gibt es in der FAQ.Das * kann Multiplikation, Dereferenzierung oder Pointer heißen.
In dem Fall Dereferenzierung.
-
Nach dem was wir in der vorlesung hatten. Aber was stimmt denn jetzt nicht an dem, was ich gemacht habe?
-
Namal schrieb:
Nach dem was wir in der vorlesung hatten. Aber was stimmt denn jetzt nicht an dem, was ich gemacht habe?
Vermutlich wo du den Index a[l + 1] veränderst.
-
Namal schrieb:
Nach dem was wir in der vorlesung hatten. Aber was stimmt denn jetzt nicht an dem, was ich gemacht habe?
Abgesehen von der unnötigen und ungeschickten Kopie: Überleg mal, welche Werte l haben kann und was wohl l + 1 dann sein kann.
edit: zu langsam.
-
Namal schrieb:
was macht eigentlich das sternchen davor?
Was gibt die Funktion zurück? Hast du nachgeschaut? (Tip: Iterator) Und was macht ein Sternchen vor einem Iterator?
Du solltest dir wirklich ein gutes Buch zulegen!
-
Allerdings wollte ich das mit meiner idee weiter probieren, also hab ich es so verändert
Hast du nicht kapiert, dass deine Idee scheisse ist. Du brauchst keinen neuen Vektor, dubrauchst die Elemente nicht vertauschen. Du brauchst dir doch nur einen einzigen Wert merken.