Für Ihre unmittelbare Problem der duplizierten letzte Zahl, ersetzen
while (in) {
in >> i;
mit nur
while(in >> i) {
Der ursprüngliche Code überprüft nicht, ob der Eingabevorgang erfolgreich ist, bevor es die anfügt Nummer zum Vektor. Somit ist am Ende der Datei, wo die Eingabeoperation fehlschlägt, die Nummer unverändert und wird angehängt.
Im Ersetzungscode versucht der Ausdruck in >> i
die Eingabeoperation und erzeugt einen Verweis auf den Datenstrom als Ausdruck Ergebnis. Die Referenz wird als while
Bedingung verwendet und bei Verwendung als Bedingung wird sie in bool
konvertiert. Diese Konvertierung wird vom Stream so definiert, dass not in.fail()
erzeugt wird, wobei fail
die Memberfunktion ist, die angibt, ob die letzte E/A-Operation in diesem Stream fehlgeschlagen oder erfolgreich war.
Tipp: Statt Zeiger um Sie vorbei C++ Referenzen verwenden können.
Mit mehr idiomatischen C++ wäre dieser Code wie & hellip;
void load_from(istream& in, vector<int>& v)
{
int i;
while(in >> i)
{
v.push_back(i);
}
}
void print(vector<int> const& v)
{
for(auto const& i : v)
{
cout << i << endl;
}
}
int main()
{
vector<int> v;
load_from(cin, v);
print(v);
}
Hinweis, dass es keine new
oder delete
Ausdrücke hier. Ein großer Teil der Verwendung von Auflistungsklassen wie vector
ist, dass es Speicherverwaltung automatisiert. Das Hinzufügen von manueller Speicherverwaltung an der Spitze vereitelt eher den Zweck.
Haftungsausschluss: Ich habe nicht versucht, den Code zu kompilieren.
Vielen Dank für Ihren Rat. Aber ich habe es einfach so gemacht, wie es die Frage erfordert. Es ist eine Übung, dynamische Speicher zu verwalten. – yughred