¿Cómo pasar un vector a una función?


85

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

1
¿Qué quieres decir con no funciona? Publique errores.
Dat Chu

1
En el código de actualizaciones: los parámetros primero y último son valores del vector, no índices. ¡Nunca estableces un valor para buscar (buscar4)!
Bo Persson

1
Usar using namespace std;es una mala idea. ¿Por qué?
Tomask

Respuestas:


131

Depende de si desea pasar el vectorcomo 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 de randomcorrespondientemente.

Problemas con su código actual

  1. binarySearchespera un vector<int>*, pero pasas un vector<int>(falta un &antes random)
  2. No elimine la referencia del puntero dentro binarySearchantes de usarlo (por ejemplo, random[mid]debe ser(*random)[mid]
  3. Te falta using namespace std;después de la <include>s
  4. Los valores que asigna firsty lastson incorrectos (deben ser 0 y 99 en lugar de random[0]yrandom[99]

"Los valores que asigna al primero y al último son incorrectos (deben ser 0 y 99 en lugar de aleatorio [0] y aleatorio [99])", pero quiero que "primero" sea el primer valor en aleatorio y "último" sea el el último. No quiero que sean los valores 0 y 99.
Joe

Joe: firsty lastson índices , no valores. Estás confundido en cuanto a lo que representan.
Jon

Entonces, ¿cómo doy Lastel último valor del vector?
Joe

oh, lo siento, veo mi error ahora. ¡Gracias!
Joe

1
@lecaruyer: Brevemente, pasar por valor significa que el contenido del vector debe ser copia-construible, y se creará una copia de todo. Los efectos de esto en la práctica podrían variar desde insignificantes a muy problemáticos desde el punto de vista del rendimiento y / o de los recursos, hasta un código que ni siquiera se compila. No hay razón para hacerlo a menos que realmente desee una segunda copia del material.
Jon

8

Tendrá que pasar el puntero al vector, no al vector en sí. Tenga en cuenta el '&' adicional aquí:

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

2

Estás pasando un puntero *randompero 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"


2

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.



0

Estás usando el argumento como referencia, pero en realidad es un puntero. Cambiar vector<int>*a vector<int>&. Y realmente debería establecer search4algo antes de usarlo.


Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.