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

4 minutos de lectura

avatar de usuario
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);
}

  • ¿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


avatar de usuario
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 binarySearchtendrás que usar . o -> para acceder a los miembros de random correspondientemente

Problemas con su código actual

  1. binarySearch espera un vector<int>*pero pasas en un vector<int> (falta un & antes de random)
  2. No desreferencias el puntero dentro binarySearch antes de usarlo (por ejemplo, random[mid] debiera ser (*random)[mid]
  3. Estás perdido using namespace std; después de la <include>s
  4. Los valores que asignas first y last son incorrectos (deberían ser 0 y 99 en lugar de random[0] y random[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 y last 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 &.

avatar de usuario
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.

avatar de usuario
Yavad Yousefi

Si utiliza random en vez de * random tu codigo no da ningun error

¿Ha sido útil esta solución?