Ich versuche, die Min- und Max-Elemente in einem Doppelvektor zu verwenden std::min_element
und std::max_element
zurückzugeben. Meinem Compiler gefällt nicht, wie ich sie derzeit verwenden möchte, und ich verstehe die Fehlermeldung nicht. Ich könnte natürlich meine eigene Prozedur schreiben, um das Min / Max zu finden, aber ich würde gerne verstehen, wie man die Funktionen benutzt.
#include <vector>
#include <algorithm>
using namespace std;
int main(int argc, char** argv) {
double cLower, cUpper;
vector<double> C;
// code to insert values in C not shown here
cLower = min_element(C.begin(), C.end());
cUpper = max_element(C.begin(), C.end());
return 0;
}
Hier ist der Compilerfehler:
../MIXD.cpp:84: error: cannot convert '__gnu_cxx::__normal_iterator<double*, std::vector<double, std::allocator<double> > >' to 'double' in assignment
../MIXD.cpp:85: error: cannot convert '__gnu_cxx::__normal_iterator<double*, std::vector<double, std::allocator<double> > >' to 'double' in assignment
Würde jemand bitte erklären, was ich falsch mache?
std::minmax_element
.Antworten:
min_element
undmax_element
Iteratoren zurückgeben, keine Werte. Also brauchst du*min_element...
und*max_element...
.quelle
*max_element
Fehler ausgelöst. Gibt es eine Lösung für dieses Problem? Im Moment überprüfe ich, ob der Vektor leer ist oder nicht und benutze dann*max_element
C.end()
.Wie schon andere gesagt haben,
std::max_element()
undstd::min_element()
Rückkehr Iteratoren , die werden müssen dereferenziert die erhalten Wert .Der Vorteil der Rückgabe eines Iterators (und nicht nur des Werts) besteht darin, dass Sie die Position des (ersten) Elements im Container mit dem maximalen (oder minimalen) Wert bestimmen können.
Zum Beispiel (der Kürze halber C ++ 11 verwenden):
#include <vector> #include <algorithm> #include <iostream> int main() { std::vector<double> v {1.0, 2.0, 3.0, 4.0, 5.0, 1.0, 2.0, 3.0, 4.0, 5.0}; auto biggest = std::max_element(std::begin(v), std::end(v)); std::cout << "Max element is " << *biggest << " at position " << std::distance(std::begin(v), biggest) << std::endl; auto smallest = std::min_element(std::begin(v), std::end(v)); std::cout << "min element is " << *smallest << " at position " << std::distance(std::begin(v), smallest) << std::endl; }
Dies ergibt:
Max element is 5 at position 4 min element is 1 at position 0
Hinweis:
Die Verwendung
std::minmax_element()
wie in den obigen Kommentaren vorgeschlagen kann bei großen Datenmengen schneller sein, jedoch zu geringfügig unterschiedlichen Ergebnissen führen. Die Werte für mein Beispiel oben wären die gleichen, aber die Position des "max" -Elements wäre9
da ...quelle
min / max_element gibt den Iterator an das min / max-Element zurück, nicht an den Wert des min / max-Elements. Sie müssen den Iterator dereferenzieren, um den Wert herauszuholen und einem Double zuzuweisen. Das ist:
quelle