vectores referencia punteros por paso pasar parametros matriz funciones ejercicios ejemplos con como c++ c++11

referencia - punteros c++



C++ 11 loop basado en rango: obtener elemento por valor o referencia a const (4)

Cuando no necesitamos cambiar los elementos de vec , los ejemplos sugieren usar la primera versión.

Entonces dan una sugerencia incorrecta.

Por qué no sugieren algo que const referencias

Porque dan una sugerencia incorrecta :-) Lo que mencionas es correcto. Si solo desea observar un objeto, no es necesario crear una copia, y no es necesario tener una referencia no const .

EDITAR:

Veo que las referencias que enlazas proporcionan ejemplos de iteración sobre un rango de valores int o algún otro tipo de datos fundamental. En ese caso, dado que copiar un int no es costoso, crear una copia es básicamente equivalente (si no más eficiente que) tener una const & observación.

Sin embargo, este no es el caso en general para los tipos definidos por el usuario. Los UDT pueden ser costosos de copiar, y si no tiene una razón para crear una copia (como modificar el objeto recuperado sin alterar el original), entonces es preferible usar un const & .

Al leer algunos ejemplos de bucles basados ​​en el rango, sugieren dos formas principales 1 , 2 , 3 , 4

std::vector<MyClass> vec; for (auto &x : vec) { // x is a reference to an item of vec // We can change vec''s items by changing x }

o

for (auto x : vec) { // Value of x is copied from an item of vec // We can not change vec''s items by changing x }

Bien.

Cuando no necesitamos cambiar los elementos de vec , IMO, los ejemplos sugieren usar la segunda versión (por valor). Por qué no sugieren algo que const referencias (Al menos no he encontrado ninguna sugerencia directa):

for (auto const &x : vec) // <-- see const keyword { // x is a reference to an const item of vec // We can not change vec''s items by changing x }

¿No es mejor? ¿No evita una copia redundante en cada iteración mientras es una const ?


Si no desea cambiar los artículos y desea evitar hacer copias, entonces auto const & es la opción correcta:

for (auto const &x : vec)

Quien te sugiera que uses el auto & es incorrecto. Ingnóralos.

Aquí está el resumen:

  • Elija auto x cuando desee trabajar con copias.
  • Elija auto &x cuando desee trabajar con elementos originales y pueda modificarlos.
  • Elija auto const &x cuando desee trabajar con elementos originales y no los modificará.

Si tiene un std::vector<int> o std::vector<double> , entonces está bien usar auto (con copia de valor) en lugar de const auto& , ya que copiar un int o un double es barato:

for (auto x : vec) ....

Pero si tiene un std::vector<MyClass> , donde MyClass tiene una semántica de copia no trivial (por ejemplo, std::string , alguna clase personalizada compleja, etc.) entonces le sugiero que use const auto& para evitar copias en profundidad :

for (const auto & x : vec) ....


Voy a ser contrario aquí y decir que no hay necesidad de auto const & en un rango basado en bucle. Dime si crees que la siguiente función es tonta (no en su propósito, sino en la forma en que está escrita):

long long SafePop(std::vector<uint32_t>& v) { auto const& cv = v; long long n = -1; if (!cv.empty()) { n = cv.back(); v.pop_back(); } return n; }

Aquí, el autor ha creado una referencia constante a v para usar en todas las operaciones que no modifican v. Esto es tonto, en mi opinión, y se puede hacer el mismo argumento para usar auto const & como la variable en un rango basado en bucle en lugar de solo auto & .