2009-02-15 5 views
7

Ist es in Ordnung, eine Referenz auf den Wert des Kartenelements zu übergeben und dort zu ändern?Verweis auf Wert des STL-Kartenelements?

foo(string & s) 
{ 
    s = "xyz"; 
} 

map<int, string> m; 
m[1] = "abc"; 
foo(m[1]); // <-- Is it ok? Will m[1] be "xyz" after this call? 

Vielen Dank.

Antwort

8

Die Antwort ist Ja.

(Operator [] liefert ein reference)

4

Ja, wir können.
Und es funktioniert auch mit std::vectors (und da es so aussieht, als ob Sie numerische Tasten verwenden, können Sie sie stattdessen verwenden).

+1

Seien Sie vorsichtig mit Vektor :: Iterator obwohl (Dereferenzierung gibt es keine Referenz) –

2

Ja.

Dies ist nicht anders zu tippen m [1] = "xyz". Der Compiler wird alles auf ungefähr dasselbe reduzieren, sobald es damit fertig ist.

1

Ein Wort des Rates: Sie könnten es als ein Zeiger anstelle einer Referenz weitergeben. Ich mache das, um es dem gelegentlichen Leser zu verdeutlichen, dass es geändert wird.

Es geht darum, klar mit dem nächsten Typ zu kommunizieren, der den Hecht herunterkommt, der diesen Code pflegen muss.

Aber abgesehen davon, ja, es ist völlig legal code!

+1

Ich stimme mit Ihrem Rat respectly nicht. Ich bevorzuge Referenzen, es sei denn, ich werde in einigen Fällen einen Nullzeiger liefern. Sonst habe ich Angst, dass ich nur einen weiteren möglichen Weg entwickle, um den Code zu missbrauchen, nämlich mit einem Nullzeiger statt einer gültigen Referenz ... –

+0

1: Sie können eine Nullreferenz übergeben. Es verletzt das Sprachprotokoll, aber es kann getan werden. Es verwendet den dereferenzierten Null, der Coredumps. 2: assert (x! = NULL) hat einen geringen Overhead. 3: Betrachte zu Zeitpunkt foo (bar); vs foo (&bar);. Das & macht es klar bar ist geändert. Meine meinung. Meine $ 0,02. –

0

Ja, es ist in Ordnung - wie jeder schon gesagt hat - und außerdem wird Ihr Compiler Ihnen sagen, wenn es nicht ist. Vielleicht möchten Sie ein wenig experimentieren; Versuchen Sie, "hallo" oder (42) an foo (string &) zu übergeben, um ein Gefühl für die Warnungen zu bekommen, die Ihr Compiler Ihnen gibt.