2010-11-24 3 views
1
list<string> l; 
string s; 

getline(cin, s); 
l.push_back(s); 
getline(cin, s); 
l.push_back(s); 

Verwendung von Input-Wiederverwendung der gleichen Zeichenfolge vor dem Einfügen in eine Liste scheint nach Wert zu übergeben?

123 
test 

Drucken der Liste 'l' Ergebnisse:

123 
test 

Sollte nicht dieser Druck:

test 
test 

Ich bin ein wenig verwirrt, Warum wird die Zeichenfolge nach Wert übergeben?

+2

Rechts. Warum hast du sonst etwas erwartet? –

+2

Ich denke, Christopher verwirrte Java-Liste und C++ - Liste –

+1

@ user440336: erstaunlich, wie jemand etwas so kaputtes erwarten kann :-). C++ 's Verhalten ist viel intuitiver, das Java/C#/Ruby-Verhalten eine Möglichkeit zu versuchen, Code geschrieben zu haben, ohne die Besitzverhältnisse zu berücksichtigen (im Allgemeinen nicht greifbar), vorausgesetzt, die Leute lernen, Dinge zu klonen, wenn die Ergebnisse falsch sind das ist wahrscheinlicher, bemerkt zu werden). Aber nur für Objekte, richtig, da es zu offensichtlich komisch wäre, wenn Strings und Zahlen sich auch so verhielten 8 -> ...! –

Antwort

1

push_backKopien der String-Objekt s hineingeben. Wahetever Änderung, die Sie zu s tun, beeinflußt nicht den zurückgeschobenen Wert.

1

Es sollte nicht, da die Zeichenfolge kopiert wird, wenn Sie es der Liste l hinzufügen. string Argument wird unter Bezugnahme auf getline geben:

istream& getline (istream& is, string& str); 
+0

Aber nach http://www.cplusplus.com/reference/stl/list/push_back/ (void push_back (const T & x);) scheint das Argument durch Verweis übergeben. –

+3

@Christopher Dorian: Das Argument kann vorbei sein Hinweis, aber das hindert die 'push_back' nicht daran, eine Kopie des übergebenen Objekts zu erstellen und in seinen internen Datenstrukturen zu speichern – Naveen

+0

@Chris: Das ist nicht genug für Sie, um abzuleiten, was es mit * dieser Referenz macht um die Dokumente genauer zu lesen – Ashe

0

Ihr Titel ist irreführend; Sie haben keine Schleife in dem von Ihnen geposteten Code.

Die Zeichenfolge wird als Wert an push_back übergeben, die eine Kopie in list erstellt. Die Ergebnisse, die Sie erhalten, sind genau das, was ich erwarten würde.

0

Pseudocode:

void list::push_back(string& s) 
{ 
    list_.add(new string(s)); // copy string 
} 

Sie sehen, wird die Zeichenfolge in push_back Methode kopiert. Es wird nur als Referenz übergeben, um ein redundantes Kopieren zu vermeiden.

void list::push_back(string s) // copy string 
{ 
    list_.add(new string(s)); // copy string 
} 
+0

Gute Punkte, aber Ihr Pseudocode sollte akzeptieren 's' durch * const * String-Referenz. –

Verwandte Themen