2016-08-01 18 views
1

Ich habe eine Struktur wie folgt erklärt:in einen Vektor von struct Pushing ein Element dieses Vektors

struct Point{ 
    double x,y; 
    Point(){} 
    Point(double xx,double yy): x(xx),y(yy){} 
}; 

Und ich versuche, den Vektor so zu füllen:

vector<Point> s(1); 
Point tmp(1,2); 
s[0]=tmp; 
s.push_back(s[0]); 

Leider , dies führt zu einer falschen Antwort, wenn ich den Inhalt von s [1] zeige, aber s.push_back((Point)s[0]) führt zu der erwarteten Antwort (z. B. eine Kopie von s [0]).

Was ist der Unterschied zwischen s.push_back(s[0]) und s.push_back((Point)s[0]), die diese differennce erklärt?

Gibt es eine automatische Konvertierung oder etwas unter der Haube?

+1

's.push_back ((Point [0]))' ergibt keinen Sinn, 'Point' ist ein Typ. – Borgleader

+2

Welche falsche/richtige Antwort auf was? – Svalorzen

+1

'Vektor s (2, Punkt (1, 2))' wäre viel besser. – DimChtz

Antwort

3

push_back take Argument const Referenz (und eine andere Überlastung durch rvalue reference), so

s.push_back(s[0]); 

verwendet lvalue Verweis des ersten Elements, aber push_back umverteilen kann, wenn Kapazität nicht groß genug ist. Und so ist der Verweis gezogen von s[0] links baumeln gelassen, und nicht mehr lebensfähig.

Auf der anderen Seite

s.push_back((Point)s[0]); 

ein temporären erstellen und dann wird s[0] nicht mehr verwendet, so dass ein gültiges Point im vector schieben.

+0

Wo in der Post verwendet OP & s [0]? Was du sagst ist wahr, aber OP tut das nicht, also ist deine Antwort AFAICT irrelevant. – Borgleader

+2

@Borgleader ist nicht das. Ich verstehe es. 's [0]' wird von const-reference auf 'push_back' übergeben, aber' push_back' kann das Sequenz-Bett auf einer resize neu zuweisen und diese * referenz * hängen lassen. Ich gebe zu, der Schlusssatz macht keinen ersichtlichen Sinn (ich hoffe, dass dieser Kommentar das tut). – WhozCraig

+0

@WhozCraig Oh ich sehe, das macht jetzt Sinn. Ich dachte immer, du könntest kein T * in einen Vektor von T zurückdrängen, selbst wenn du es versucht hast, und hast nicht gesehen, dass es auch auf Referenzen angewendet wurde. Guter Fang. – Borgleader