2011-03-16 26 views
61

Estoy tratando de enviar un vector como argumento para una función y no puedo encontrar la manera de hacerlo funcionar. Intenté un montón de maneras diferentes, pero todas dan diferentes mensajes de error. Solo incluyo parte del código, ya que solo esta parte no funciona. (el vector "al azar" se llena de azar, pero ordenados, los valores entre 0 y 200)¿Cómo pasar un vector a una función?

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); 
} 
+1

¿A qué te refieres con que no funciona? Por favor publique errores. –

+1

En el código de actualizaciones: Los parámetros primero y último son ** valores ** del vector, no índices. ¡Usted nunca establece un valor para buscar (búsqueda4)! –

+1

Usar 'using namespace std;' es una mala idea. [¿Por qué?] (Http://stackoverflow.com/questions/1452721/why-is-using-namespace-std-considered-bad-practice) – Tomask

Respuesta

101

Depende de si desea pasar el vector como referencia o como un puntero (no estoy haciendo caso de la opción de pasarlo por valor como claramente indeseable).

Como referencia:

int binarySearch(int first, int last, int search4, vector<int>& random); 

vector<int> random(100); 
// ... 
found = binarySearch(first, last, search4, random); 

Como un puntero:

int binarySearch(int first, int last, int search4, vector<int>* random); 

vector<int> random(100); 
// ... 
found = binarySearch(first, last, search4, &random); 

Dentro binarySearch, tendrá que utilizar . o -> acceder a los miembros de random correspondientemente.

Problemas con el código actual

  1. binarySearch espera un vector<int>*, pero se pasa en un vector<int> (falta un & antes random)
  2. No hace eliminar la referencia al puntero dentro binarySearch antes de usarlo (por ejemplo, random[mid] debe ser (*random)[mid]
  3. Te has perdido using namespace std; después del <include> s
  4. Los valores que se asignan a first y last están equivocados (debe ser 0 y 99 en lugar de random[0] y random[99]
+0

"Los valores que asigna al primero y al último son incorrectos (deberían ser 0 y 99 en lugar de al azar [0] y al azar [99] "- pero quiero que" primero "sea el primer valor al azar y" último "sea el último. No quiero que sean los valores 0 y 99. – Joe

+0

Joe: 'first' y' last' son * índices *, no valores. Estás confundido en cuanto a lo que representan. – Jon

+0

Entonces, ¿cómo doy 'Last' el último valor del vector? – Joe

1
found = binarySearch(first, last, search4, &random); 

Aviso del &.

2

Estás pasando un puntero *random pero se está usando como una referencia &random

El puntero (lo que tiene) dice: "Esta es la dirección en la memoria que contiene la dirección de azar"

La referencia dice "Esta es la dirección de al azar"

0

Está utilizando el argumento como referencia, pero en realidad es un puntero. Cambie vector<int>* a vector<int>&. Y realmente debe establecer search4 en algo antes de usarlo.

6

Vas a tener que pasar el puntero al vector, y no el propio vector.Tenga en cuenta el adicional '&' aquí:

found = binarySearch(first, last, search4, &random); 
+3

Esta es una referencia, no un puntero. – Andrew

0

Si utiliza random en lugar de * random su código no da ningún error

2

Cada vez que sientas la tentación de pasar a una colección (o 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, haga 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, no hay mucho sentido ya que la biblioteca estándar ya tiene una búsqueda binaria perfecta, pero cuando/si escribe algo que no está allí todavía, poder usarlo en diferentes tipos de contenedores es a menudo bastante práctico.

Cuestiones relacionadas