2009-02-15 19 views
7

¿Está bien pasar a funcionar una referencia al valor del elemento del mapa, y modificarlo allí?¿Referencia al valor del elemento de mapa STL?

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? 

Gracias.

Respuesta

8

La respuesta es Sí.

(operador [] devuelve un reference)

4

Sí, podemos.
Y también funciona con std::vectors (y dado que parece que está utilizando claves numéricas, puede considerar usarlas en su lugar).

+1

tenga cuidado con el vector :: iterator though (desreferencia no proporciona una referencia) –

2

Sí.

Esto no es diferente a escribir m [1] = "xyz". El compilador reducirá todo a casi lo mismo una vez que haya terminado con él.

1

Un consejo: Es posible que desee pasarlo como un puntero en lugar de una referencia. Hago eso para que sea más obvio para el lector casual que será cambiado.

Se trata de comunicar claramente con el siguiente hombre que baja por la pica, que tiene que mantener este código.

Pero aparte de eso, sí, ¡es un código completamente legal!

+1

Respetuosamente, no estoy de acuerdo con su consejo. Tiendo a preferir las referencias a menos que vaya a proporcionar un puntero nulo en algunos casos. De lo contrario, me temo que solo estoy creando una forma más posible de hacer un mal uso del código, es decir, con un puntero nulo en lugar de una referencia válida ... –

+0

1: puede pasar una referencia nula. Viola el protocolo de lenguaje pero se puede hacer. Está utilizando el nulo desreferenciado que los núcleos. 2: assert (x! = NULL) tiene poca sobrecarga. 3: En el punto de llamada, considere foo (bar); vs foo (&bar);. Eso y lo hace claro, la barra ha cambiado. Mi opinión. Mi $ 0.02. –

0

Sí, está bien, como todos ya han dicho, y además, su compilador le dirá si no es así. Es posible que desee experimentar un poco; intente pasar "hola" o (42) a foo (cadena &) para tener una idea de las advertencias que su compilador le brinda.

Cuestiones relacionadas