vector casting
-
Hallo.
Bin absoluter Programmierneuling und brauche eure Hilfe.
Ich möchte einen String vektor (abc) in einen double vektor (abcDouble) "konvertieren". Hat jemand eine idee, wie das funktionieren könnte? Was ich probiert habe ist folgendes:
for (unsigned int i = 0; i != abc.size(); i++)
{
vector <double> abcDouble[i] = atof(abc[i].c_str());
}Da kommt immer der Fehler, dass i einen Konstantwert haben muss. Wäre nett, wenn mir jemand weiterhelfen könnte. Dankeschön!
-
In der Schleife das vector <double> weglassen.
Willst ja den vector nicht immer wieder neu definieren, sondern nur benutzen.
-
prima, danke dir!
-
Moin!
Da Du als Anfänger schon mitvectorhantierst, gehe ich von guten Lehrmaterialen bei Dir aus und mute ich Dir gleich noch ein bisschen mehr Elemente aus der Standardbibliothek zu.
Jedenfalls wird Dich das nicht sofort überfordern
Höchstens der Lambda Ausdruck wird Dich die Stirn runzeln lassen...#include <algorithm> // transform #include <string> #include <vector> int main(){ using namespace std; vector<string> abs{ "-0.9","1.87","4e-8",".42","0." }; vector<double> abcDouble( abs.size() ); // gleich auf die richtige Groesse bringen transform(begin(abs), end(abs), begin(abcDouble), [](const string& s){ return stod(s); // atof für string }); }
-
[](const string& s){ return stod(s); // atof für string }Was spricht dagegen,
stodeinfach direkt zu übergeben?
-
Sone schrieb:
[](const string& s){ return stod(s); // atof für string }Was spricht dagegen,
stodeinfach direkt zu übergeben?
Dass die Funktion überladen ist und einen zweiten Parameter hat?
Mir schien das Lambda am übersichtlichsten.
Oder übersehe ich was offensichtliches?
-
Furble Wurble schrieb:
Sone schrieb:
[](const string& s){ return stod(s); // atof für string }Was spricht dagegen,
stodeinfach direkt zu übergeben?
Dass die Funktion überladen ist und einen zweiten Parameter hat?
Mir schien das Lambda am übersichtlichsten.
Oder übersehe ich was offensichtliches?Ne, schon richtig so. (Habe nicht getestet)
-
Hi.
Danke für die schnellen Antworten gestern. So wie Furble Wurble das beschrieben hat funktioniert alles wunderbar, aber was bedeutet [] ? und const string& s ist soweit ich das verstanden habe eine Adressvariable, oder? Danke!
-
lukasprogrammiert schrieb:
...aber was bedeutet [] ? und const string& s ist soweit ich das verstanden habe eine Adressvariable, oder?
Ersteres ist Teil der Syntax für einen Lambda Ausdruck. In die eckigen Klammern gehören die Inhalte, welche in den Scope der namenlosen Funktion wie übernommen werden sollen (in diesem Fall keine, die Funktion ist komplett eigenständig.)
Zweiteres besagt, dass die Funktion für s die Referenz des übergebenen Wertes übernimmt, anstatt eine Kopie zu machen. Es ist ähnlich der Übergabe eines Pointers, aber die Schreibweise ist die eines Objektes.
-
Schau in Deinen Unterlagen, was dort zum Thema Argumente von Funktionen steht. Wahrscheinlich findest Du die Kapiel/Stichworte "Übergabe per Wert" (eng. "pass by value"), und "Übergabe per Referenz" (eng. "pass by reference"). Dort wird erklärt, was
const string&bedeutet.Den Lambda Ausdruck
[](){}kannst Du Dir als Funktion(-sobjekt) vorstellen.
Im großen und ganzen ist das so ähnlich wie folgende Variante des Programmsdouble string_to_double(const std::string& s){ return stod(s); } int main(){ using namespace std; vector<string> abs{ "-0.9","1.87","4e-8",".42","0." }; vector<double> abcDouble( abs.size() ); // gleich auf die richtige Groesse bringen transform(begin(abs), end(abs), begin(abcDouble), string_to_double); }Vergleiche ich diese Variante mit der Lambda-Variante fällt auf, dass ich in Zeile 9 beim
transform()nicht sehe, wie transformiert wird und dass ich mir einen Funktionsnamen aus den Rippen leiern muss, der jetzt irgendwo rumgeistert, obwohl ich den vielleicht nur für diese eine Transformation brauche.Das ist ein Feature, das relativ neu in der Sprache ist und daher nicht in älterer Literatur behandelt wird. Aber z.B. hier msdn.microsoft.com wird es ausführlich beschrieben.