Jak przekazać wektor do funkcji?


85

Próbuję wysłać wektor jako argument do funkcji i nie mogę dowiedzieć się, jak to działa. Wypróbowano kilka różnych sposobów, ale wszystkie dają różne komunikaty o błędach. Załączam tylko część kodu, ponieważ tylko ta część nie działa. (wektor „losowy” jest wypełniony losowymi, ale posortowanymi wartościami od 0 do 200)

Zaktualizowałem kod:

#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
Co masz na myśli mówiąc, że nie działa? Prosimy o publikowanie błędów.
Dat Chu

1
W kodzie aktualizacji: parametry pierwszy i ostatni są wartościami z wektora, a nie indeksami. Nigdy też nie ustawiasz wartości do wyszukania (szukaj4)!
Bo Persson,

1
Używanie using namespace std;to zły pomysł. Czemu?
Tomask

Odpowiedzi:


131

Zależy to od tego, czy chcesz przekazać vectorjako odniesienie, czy jako wskaźnik (pomijam opcję przekazywania go przez wartość jako wyraźnie niepożądaną).

Jako odniesienie:

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

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

Jako wskaźnik:

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

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

Wewnątrz binarySearchbędziesz musiał odpowiednio użyć .lub ->uzyskać dostęp do członków random.

Problemy z aktualnym kodem

  1. binarySearchoczekuje a vector<int>*, ale zdasz a vector<int>(brakuje a &przed random)
  2. Nie wyłuskujesz wewnętrznego wskaźnika binarySearchprzed jego użyciem (na przykład random[mid]powinien(*random)[mid]
  3. Brakuje ci using namespace std;po <include>s
  4. Wartości, które przypisujesz firsti lastsą błędne (powinny wynosić 0 i 99 zamiast random[0]irandom[99]

„Wartości przypisane do wartości first i last są nieprawidłowe (powinny wynosić 0 i 99 zamiast losowych [0] i losowych [99])” - ale chcę, aby „pierwsza” była pierwszą wartością w kolejności losowej, a „ostatnia” była ostatni. Nie chcę, żeby były to wartości 0 i 99.
Joe

Joe: firsti lastindeksami , a nie wartościami. Nie wiesz, co one reprezentują.
Jon

Jak Lastzatem podać ostatnią wartość wektora?
Joe

och, przepraszam, teraz widzę mój błąd. Dziękuję Ci!
Joe

1
@lecaruyer: Krótko mówiąc, przekazywanie przez wartość oznacza, że ​​zawartość wektora musi być możliwa do skopiowania, a kopia wszystkiego zostanie faktycznie utworzona. Skutki tego mogą w praktyce wahać się od pomijalnych, przez bardzo problematyczne z punktu widzenia wydajności i / lub zasobów, do kodu, który nawet się nie kompiluje. Nie ma powodu, aby to robić, chyba że naprawdę chcesz mieć drugą kopię tego materiału.
Jon

8

Będziesz musiał przekazać wskaźnik do wektora, a nie sam wektor. Zwróć uwagę na dodatkowe „&” tutaj:

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

2

Przekazujesz wskaźnik, *randomale używasz go jako odniesienia&random

Wskaźnik (co masz) mówi „To jest adres w pamięci, który zawiera losowy adres”

Odnośnik mówi „To jest adres losowy”


2

Za każdym razem, gdy masz ochotę przekazać kolekcję (lub wskaźnik lub odwołanie do jednej z nich) do funkcji, zadaj sobie pytanie, czy nie możesz zamiast tego przekazać kilku iteratorów. Jest szansa, że ​​robiąc to, sprawisz, że twoja funkcja będzie bardziej wszechstronna (np. Sprawisz, że praca z danymi w innym typie kontenera, kiedy / w razie potrzeby, będzie banalna).

W tym przypadku oczywiście nie ma to większego sensu, ponieważ standardowa biblioteka ma już doskonale dobre wyszukiwanie binarne, ale kiedy / jeśli napiszesz coś, czego jeszcze nie ma, możliwość użycia tego na różnych typach kontenerów jest często bardzo przydatna.



0

Używasz argumentu jako odniesienia, ale w rzeczywistości jest to wskaźnik. Zmień vector<int>*na vector<int>&. I naprawdę powinieneś coś ustawić search4przed użyciem.


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.