web-dev-qa-db-fra.com

Comment passer un vecteur à une fonction?

J'essaie d'envoyer un vecteur comme argument à une fonction et je ne vois pas comment le faire fonctionner. Essayé un tas de façons différentes, mais ils donnent tous des messages d'erreur différents. Je n'inclue qu'une partie du code, car seule cette partie ne fonctionne pas. (le vecteur "aléatoire" est rempli de valeurs aléatoires, mais triées, comprises entre 0 et 200)

Mis à jour le code:

#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);
}
80
Joe

Cela dépend si vous voulez passer la vector comme référence ou comme pointeur (je ne tiens pas compte de la possibilité de la transmettre par valeur comme étant clairement indésirable).

Pour référence:

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

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

En tant que pointeur:

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

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

Dans binarySearch, vous devrez utiliser . ou -> pour accéder aux membres de random en conséquence.

Problèmes avec votre code actuel

  1. binarySearch attend un vector<int>*, mais vous transmettez un vector<int> (il manque un & avant random)
  2. Vous ne déréférenciez pas le pointeur dans binarySearch avant de l’utiliser (par exemple, random[mid] devrait être (*random)[mid]
  3. Il vous manque using namespace std; après le <include>s
  4. Les valeurs que vous attribuez à first et last sont erronées (elles doivent être 0 et 99 au lieu de random[0] et random[99].
124
Jon

Vous devrez passer le pointeur sur le vecteur, pas sur le vecteur lui-même. Notez le '' supplémentaire ici:

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

Chaque fois que vous êtes tenté de transmettre une collection (ou un pointeur ou une référence à une) à une fonction, demandez-vous si vous ne pouvez pas transmettre deux itérateurs à la place. Il est donc probable que cela rendra votre fonction plus polyvalente (par exemple, il sera facile de travailler avec des données dans un autre type de conteneur, le cas échéant).

Dans ce cas, bien sûr, il n’ya pas grand-chose d’intérêt dans la mesure où la bibliothèque standard offre déjà une excellente recherche binaire, mais lorsque vous écrivez quelque chose qui n’est pas déjà présent, il est souvent très pratique de l’utiliser sur différents types de conteneurs.

2
Jerry Coffin

Vous passez dans un pointeur *random mais vous l'utilisez comme une référence &random

Le pointeur (ce que vous avez) dit "Ceci est l'adresse en mémoire qui contient l'adresse de aléatoire"

La référence dit "Ceci est l'adresse du hasard"

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

Notez le &.

1
Daniel A. White

Si vous utilisez random au lieu de * random votre code ne donne aucune erreur

0
Javad Yousefi

Vous utilisez l'argument comme référence, mais en réalité c'est un pointeur. Remplacez vector<int>* par vector<int>&. Et vous devriez vraiment définir search4 sur quelque chose avant de l'utiliser.

0
Puppy