Estoy tratando de enviar un vector como argumento a una función y no puedo averiguar 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);
}
using namespace std;
es una mala idea. ¿Por qué?Respuestas:
Depende de si desea pasar el
vector
como referencia o como puntero (estoy descartando 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
, deberá utilizar.
o->
acceder a los miembros derandom
correspondientemente.Problemas con su código actual
binarySearch
espera unvector<int>*
, pero pasas unvector<int>
(falta un&
antesrandom
)binarySearch
antes de usarlo (por ejemplo,random[mid]
debe ser(*random)[mid]
using namespace std;
después de la<include>
sfirst
ylast
son incorrectos (deben ser 0 y 99 en lugar derandom[0]
yrandom[99]
fuente
first
ylast
son índices , no valores. Estás confundido en cuanto a lo que representan.Last
el último valor del vector?Tendrá que pasar el puntero al vector, no al vector en sí. Tenga en cuenta el '&' adicional aquí:
fuente
Estás pasando un puntero
*random
pero lo estás usando como 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 aleatoria"
fuente
Cada vez que tenga la tentación de pasar una colección (o puntero o referencia a una) 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 sea 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.
fuente
Observe el
&
.fuente
Estás usando el argumento como referencia, pero en realidad es un puntero. Cambiar
vector<int>*
avector<int>&
. Y realmente debería establecersearch4
algo antes de usarlo.fuente
Si usa en
random
lugar de* random
su código no da ningún errorfuente