Estoy codificando en C ++. Si tengo alguna función void foo(vector<int> test)
y la llamo en mi programa, ¿se pasará el vector por valor o referencia? No estoy seguro porque sé que los vectores y las matrices son similares y que una función como void bar(int test[])
pasaría la prueba por referencia (¿puntero?) En lugar de por valor. Supongo que necesitaría pasar el vector por puntero / referencia explícitamente si quisiera evitar pasar por valor, pero no estoy seguro.
94
Respuestas:
Si tuviera que adivinar, diría que tiene experiencia en Java. Esto es C ++, y las cosas se pasan por valor a menos que especifique lo contrario usando el
&
-operador (tenga en cuenta que este operador también se usa como el operador 'dirección de', pero en un contexto diferente). Todo esto está bien documentado, pero repetiré de todos modos:También puede optar por pasar un puntero a un vector (
void foo(vector<int> *bar)
), pero a menos que sepa lo que está haciendo y sienta que este es realmente el camino a seguir, no lo haga.Además, los vectores no son lo mismo que las matrices. Internamente, el vector realiza un seguimiento de una matriz de la que gestiona la memoria por usted, pero también lo hacen muchos otros contenedores STL. No puede pasar un vector a una función que espera un puntero o matriz o viceversa (puede obtener acceso (puntero a) la matriz subyacente y usar esto). Los vectores son clases que ofrecen mucha funcionalidad a través de sus funciones miembro, mientras que los punteros y las matrices son tipos integrados. Además, los vectores se asignan dinámicamente (lo que significa que el tamaño se puede determinar y cambiar en tiempo de ejecución) mientras que los arreglos de estilo C se asignan estáticamente (su tamaño es constante y debe conocerse en tiempo de compilación), lo que limita su uso.
Le sugiero que lea un poco más sobre C ++ en general (específicamente la desintegración de matrices ) y luego eche un vistazo al siguiente programa que ilustra la diferencia entre matrices y punteros:
fuente
A
vector
es funcionalmente igual que una matriz. Pero para el lenguajevector
es un tipo, yint
también es un tipo. Para un argumento de función, una matriz de cualquier tipo (incluidovector[]
) se trata como puntero. Avector<int>
no es lo mismo queint[]
(para el compilador).vector<int>
es sin matriz, sin referencia y sin puntero: se pasa por valor y, por lo tanto, llamará al constructor de copia.Por lo tanto, debe usar
vector<int>&
(preferiblemente conconst
, si la función no lo está modificando) para pasarlo como referencia.fuente
void foo(vector<int> test)
vector se pasaría por valor en este.
Tiene más formas de pasar vectores según el contexto: -
1) Pasar por referencia: - Esto permitirá que la función foo cambie el contenido del vector. Más eficiente que pasar por valor, ya que se evita la copia de vectores.
2) Pasar por referencia constante: - Esto es eficiente y confiable cuando no desea que la función cambie el contenido del vector.
fuente
cuando pasamos vector por valor en una función como argumento, simplemente crea la copia del vector y no ocurre ningún efecto en el vector que se define en la función principal cuando llamamos a esa función en particular. mientras que cuando pasamos vector por referencia lo que esté escrito en esa función en particular, cada acción se realizará en el vector que está definido en la función principal u otra cuando llamamos a esa función en particular.
fuente