José
Estoy tratando de enviar un vector como argumento a una función y no sé cómo hacer que funcione. Intenté un montón de formas diferentes, pero todas dan diferentes mensajes de error. Solo incluyo parte del código, ya que solo esta parte no funciona. (el vector “aleatorio” se llena con valores aleatorios, pero ordenados, entre 0 y 200)
Actualizado el código:
#include <iostream>
#include <ctime>
#include <algorithm>
#include <vector>
using namespace std;
int binarySearch(int first, int last, int search4, vector<int>& random);
int main()
{
vector<int> random(100);
int search4, found;
int first = 0;
int last = 99;
found = binarySearch(first, last, search4, random);
system("pause");
return(0);
}
int binarySearch(int first, int last, int search4, vector<int>& random)
{
do
{
int mid = (first + last) / 2;
if (search4 > random[mid])
first = mid + 1;
else if (search4 < random[mid])
last = mid - 1;
else
return mid;
} while (first <= last);
return -(first + 1);
}
Jon
Depende de si quieres pasar el vector
como referencia o como puntero (descarto la opción de pasarlo por valor como claramente indeseable).
Como una referencia:
int binarySearch(int first, int last, int search4, vector<int>& random);
vector<int> random(100);
// ...
found = binarySearch(first, last, search4, random);
Como puntero:
int binarySearch(int first, int last, int search4, vector<int>* random);
vector<int> random(100);
// ...
found = binarySearch(first, last, search4, &random);
En el interior binarySearch
tendrás que usar .
o ->
para acceder a los miembros de random
correspondientemente
Problemas con su código actual
binarySearch
espera unvector<int>*
pero pasas en unvector<int>
(falta un&
antes derandom
)- No desreferencias el puntero dentro
binarySearch
antes de usarlo (por ejemplo,random[mid]
debiera ser(*random)[mid]
- Estás perdido
using namespace std;
después de la<include>
s - Los valores que asignas
first
ylast
son incorrectos (deberían ser 0 y 99 en lugar derandom[0]
yrandom[99]
-
“Los valores que asignas al primero y al último son incorrectos (deberían ser 0 y 99 en lugar de aleatorios)[0] y al azar[99]”- pero quiero que “primero” sea el primer valor aleatorio y “último” sea el último. No quiero que sean los valores 0 y 99.
– José
17 de marzo de 2011 a las 0:36
-
José:
first
ylast
son índices, no valores. Estás confundido en cuanto a lo que representan.– Jon
17 de marzo de 2011 a las 1:24
-
entonces como doy
Last
el último valor del vector?– José
17 de marzo de 2011 a las 10:02
-
oh, lo siento, veo mi error ahora. ¡Gracias!
– José
17 de marzo de 2011 a las 23:17
-
@lecaruyer: Brevemente, pasar por valor significa que el contenido del vector debe ser copiable y se creará una copia de todo. En la práctica, los efectos de esto podrían variar desde insignificantes hasta muy problemáticos desde el punto de vista del rendimiento y/o de los recursos, hasta código que ni siquiera se compila. No hay razón para hacerlo a menos que realmente quieras una segunda copia del material.
– Jon
29 de junio de 2017 a las 19:29
Tendrás que pasar el puntero al vector, no al vector en sí. Tenga en cuenta el ‘&’ adicional aquí:
found = binarySearch(first, last, search4, &random);
Estás pasando en un puntero *random
pero lo estás usando como una referencia &random
El puntero (lo que tiene) dice “Esta es la dirección en la memoria que contiene la dirección aleatoria”
La referencia dice “Esta es la dirección de random”
Cada vez que tenga la tentación de pasar una colección (o un puntero o una referencia a uno) a una función, pregúntese si no podría pasar un par de iteradores en su lugar. Lo más probable es que al hacerlo, hará que su función sea más versátil (por ejemplo, haga que sea trivial trabajar con datos en otro tipo de contenedor cuando/si es necesario).
En este caso, por supuesto, no tiene mucho sentido ya que la biblioteca estándar ya tiene una búsqueda binaria perfectamente buena, pero cuando/si escribe algo que aún no está allí, poder usarlo en diferentes tipos de contenedores suele ser bastante útil.
found = binarySearch(first, last, search4, &random);
Observe la &
.
Cachorro
Está utilizando el argumento como referencia, pero en realidad es un puntero. Cambio vector<int>*
a vector<int>&
. Y realmente deberías establecer search4
a algo antes de usarlo.
Yavad Yousefi
Si utiliza random
en vez de * random
tu codigo no da ningun error
¿A qué te refieres con que no funciona? Por favor, publique errores.
– Dat Chu
16 de marzo de 2011 a las 23:38
En el código de actualizaciones: los parámetros primero y último son valores del vector, no de los índices. ¡Nunca establece un valor para buscar (buscar4)!
– Bo Person
17 de marzo de 2011 a las 10:32
Usando
using namespace std;
es una mala idea ¿Por qué?– Para enmascarar
28 de diciembre de 2015 a las 13:35