Ich versuche, einen Vektor als Argument an eine Funktion zu senden, und ich kann nicht herausfinden, wie es funktioniert. Versuchte eine Reihe von verschiedenen Möglichkeiten, aber alle geben unterschiedliche Fehlermeldungen. Ich füge nur einen Teil des Codes hinzu, da nur dieser Teil nicht funktioniert. (Der Vektor "zufällig" ist mit zufälligen, aber sortierten Werten zwischen 0 und 200 gefüllt.)
Der Code wurde aktualisiert:
#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);
}
using namespace std;
ist eine schlechte Idee. Warum?Antworten:
Es kommt darauf an, ob Sie das bestehen wollen
vector
als Referenz oder als Zeiger übergeben (ich ignoriere die Option, es als Wert zu übergeben, als eindeutig unerwünscht).Als Referenz:
Als Zeiger:
Im Inneren
binarySearch
müssen Sie die Mitglieder von verwenden.
oder->
darauf zugreifenrandom
entsprechend .Probleme mit Ihrem aktuellen Code
binarySearch
erwartet einvector<int>*
, aber Sie geben einvector<int>
(fehlt ein&
vorherrandom
)binarySearch
bevor Sie ihn verwenden (random[mid]
sollte es beispielsweise sein)(*random)[mid]
using namespace std;
nach dem<include>
sfirst
undlast
die falsch sind (sollten 0 und 99 anstelle vonrandom[0]
und seinrandom[99]
quelle
first
undlast
sind Indizes , keine Werte. Sie sind verwirrt darüber, was sie darstellen.Last
den letzten Wert des Vektors an?Sie müssen den Zeiger auf den Vektor übergeben, nicht auf den Vektor selbst. Beachten Sie das zusätzliche '&' hier:
quelle
Sie geben einen Zeiger weiter
*random
, verwenden ihn jedoch als Referenz&random
Der Zeiger (was Sie haben) sagt "Dies ist die Adresse im Speicher, die die Adresse des Zufalls enthält"
Die Referenz sagt "Dies ist die Adresse des Zufalls"
quelle
Wenn Sie versucht sind, eine Sammlung (oder einen Zeiger oder einen Verweis auf eine) an eine Funktion zu übergeben, fragen Sie sich, ob Sie nicht stattdessen ein paar Iteratoren übergeben können. Möglicherweise können Sie dadurch Ihre Funktion vielseitiger gestalten (z. B. ist es trivial, bei Bedarf mit Daten in einem anderen Containertyp zu arbeiten).
In diesem Fall macht es natürlich nicht viel Sinn, da die Standardbibliothek bereits über eine einwandfreie Binärsuche verfügt. Wenn Sie jedoch etwas schreiben, das noch nicht vorhanden ist, ist es oft sehr praktisch, es für verschiedene Containertypen verwenden zu können.
quelle
Beachten Sie die
&
.quelle
Sie verwenden das Argument als Referenz, aber tatsächlich ist es ein Zeiger. Wechseln Sie
vector<int>*
zuvector<int>&
. Und Sie sollten wirklichsearch4
etwas einstellen , bevor Sie es verwenden.quelle
Wenn Sie
random
anstelle* random
Ihres Codes verwenden, geben Sie keinen Fehlerquelle