Wie übergebe ich einen Vektor an eine Funktion?

84

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);
}
Joe
quelle
1
Was meinst du mit funktioniert nicht? Bitte poste Fehler.
Dat Chu
1
Zum Aktualisierungscode: Die Parameter first und last sind Werte aus dem Vektor, keine Indizes. Sie haben auch nie einen Wert festgelegt, nach dem gesucht werden soll (search4)!
Bo Persson
1
Verwenden using namespace std;ist eine schlechte Idee. Warum?
Tomask

Antworten:

130

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:

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

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

Als Zeiger:

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

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

Im Inneren binarySearchmüssen Sie die Mitglieder von verwenden .oder ->darauf zugreifenrandom entsprechend .

Probleme mit Ihrem aktuellen Code

  1. binarySearcherwartet ein vector<int>*, aber Sie geben ein vector<int>(fehlt ein &vorher random)
  2. Sie dereferenzieren den Zeiger im Inneren nicht, binarySearchbevor Sie ihn verwenden ( random[mid]sollte es beispielsweise sein)(*random)[mid]
  3. Sie fehlen using namespace std;nach dem <include>s
  4. Die Werte, die Sie zuweisen firstund lastdie falsch sind (sollten 0 und 99 anstelle von random[0]und seinrandom[99]
Jon
quelle
"Die Werte, die Sie zuerst und zuletzt zuweisen, sind falsch (sollten 0 und 99 anstelle von zufällig [0] und zufällig [99] sein" - aber ich möchte, dass "zuerst" der erste zufällige Wert ist und "zuletzt" der Ich möchte nicht, dass sie die Werte 0 und 99 haben.
Joe
Joe: firstund lastsind Indizes , keine Werte. Sie sind verwirrt darüber, was sie darstellen.
Jon
Wie gebe ich dann Lastden letzten Wert des Vektors an?
Joe
Oh, es tut mir leid, ich sehe jetzt mein falsches Ergebnis. Danke dir!
Joe
1
@lecaruyer: Kurz gesagt bedeutet das Übergeben von Werten, dass der Inhalt des Vektors kopierkonstruierbar sein muss und eine Kopie von allem tatsächlich erstellt wird. Die Auswirkungen könnten in der Praxis von vernachlässigbar über aus Sicht der Leistung und / oder Ressourcen sehr problematisch bis hin zu Code reichen, der nicht einmal kompiliert wird. Es gibt keinen Grund, dies zu tun, es sei denn, Sie möchten wirklich eine zweite Kopie des Materials.
Jon
8

Sie müssen den Zeiger auf den Vektor übergeben, nicht auf den Vektor selbst. Beachten Sie das zusätzliche '&' hier:

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

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"

corsiKa
quelle
2

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.

Jerry Sarg
quelle
1
found = binarySearch(first, last, search4, &random);

Beachten Sie die &.

Daniel A. White
quelle
0

Sie verwenden das Argument als Referenz, aber tatsächlich ist es ein Zeiger. Wechseln Sie vector<int>*zu vector<int>&. Und Sie sollten wirklich search4etwas einstellen , bevor Sie es verwenden.

Hündchen
quelle
0

Wenn Sie randomanstelle * randomIhres Codes verwenden, geben Sie keinen Fehler

Javad Yousefi
quelle