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);
}
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
binarySearch
attend un vector<int>*
, mais vous transmettez un vector<int>
(il manque un &
avant random
)binarySearch
avant de l’utiliser (par exemple, random[mid]
devrait être (*random)[mid]
using namespace std;
après le <include>
sfirst
et last
sont erronées (elles doivent être 0 et 99 au lieu de random[0]
et random[99]
.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);
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.
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"
found = binarySearch(first, last, search4, &random);
Notez le &
.
Si vous utilisez random
au lieu de * random
votre code ne donne aucune erreur
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.