Come passare un vettore a una funzione?


86

Sto cercando di inviare un vettore come argomento a una funzione e non riesco a capire come farlo funzionare. Ho provato un sacco di modi diversi, ma tutti danno messaggi di errore diversi. Includo solo una parte del codice, poiché è solo questa parte che non funziona. (il vettore "casuale" è riempito con valori casuali, ma ordinati, compresi tra 0 e 200)

Aggiornato il codice:

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

1
Cosa intendi con non funziona? Si prega di pubblicare errori.
Dat Chu

1
Sul codice degli aggiornamenti: i parametri first e last sono valori del vettore, non indici. Inoltre non hai mai impostato un valore da cercare (search4)!
Bo Persson

1
Usare using namespace std;è una cattiva idea. Perché?
Tomask

Risposte:


132

Dipende da se si desidera passare vectorcome riferimento o come puntatore (sto ignorando l'opzione di passarlo per valore in quanto chiaramente indesiderabile).

Come referenza:

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

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

Come indicatore:

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

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

All'interno binarySearch, dovrai utilizzare .o ->accedere ai membri di randomcorrispondentemente.

Problemi con il codice corrente

  1. binarySearchaspetta una vector<int>*, ma passi in una vector<int>(manca una &prima random)
  2. Non dereferenziare il puntatore all'interno binarySearchprima di usarlo (ad esempio, random[mid]dovrebbe essere(*random)[mid]
  3. Ti manca using namespace std;dopo la <include>s
  4. I valori a cui assegni firste lastsono sbagliati (dovrebbero essere 0 e 99 invece di random[0]erandom[99]

"I valori che assegni a first e last sono sbagliati (dovrebbero essere 0 e 99 invece di random [0] e random [99]" - ma voglio che "first" sia il primo valore in random e "last" sia il l'ultimo. Non voglio che siano i valori 0 e 99.
Joe

Joe: firste lastsono indici , non valori. Sei confuso su ciò che rappresentano.
Jon

Allora come do Lastl'ultimo valore del vettore?
Joe

oh, mi dispiace, ora vedo il mio errore. Grazie!
Joe

1
@lecaruyer: In breve, passare per valore significa che il contenuto del vettore deve essere riproducibile in copia e verrà effettivamente creata una copia di tutto. Gli effetti di ciò potrebbero in pratica variare da trascurabili, a molto problematici dal punto di vista delle prestazioni e / o delle risorse, al codice che non si compila nemmeno. Non c'è motivo per farlo a meno che tu non voglia davvero una seconda copia del materiale.
Jon,

8

Dovrai passare il puntatore al vettore, non al vettore stesso. Nota il "&" aggiuntivo qui:

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

2

Stai passando un puntatore *randomma lo stai usando come riferimento&random

Il puntatore (quello che hai) dice "Questo è l'indirizzo in memoria che contiene l'indirizzo di random"

Il riferimento dice "Questo è l'indirizzo di casuale"


2

Ogni volta che sei tentato di passare una raccolta (o un puntatore o un riferimento a uno) a una funzione, chiediti se invece non potresti passare un paio di iteratori. È probabile che così facendo renderai la tua funzione più versatile (ad esempio, renderai banale lavorare con i dati in un altro tipo di contenitore quando / se necessario).

In questo caso, ovviamente, non ha molto senso dato che la libreria standard ha già una ricerca binaria perfettamente buona, ma quando / se scrivi qualcosa che non è già lì, essere in grado di usarlo su diversi tipi di contenitori è spesso abbastanza utile.



0

Stai usando l'argomento come riferimento ma in realtà è un puntatore. Cambia vector<int>*in vector<int>&. E dovresti davvero impostare search4qualcosa prima di usarlo.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.