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);
}
using namespace std;
to zły pomysł. Czemu?Odpowiedzi:
Zależy to od tego, czy chcesz przekazać
vector
jako 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
binarySearch
będziesz musiał odpowiednio użyć.
lub->
uzyskać dostęp do członkówrandom
.Problemy z aktualnym kodem
binarySearch
oczekuje avector<int>*
, ale zdasz avector<int>
(brakuje a&
przedrandom
)binarySearch
przed jego użyciem (na przykładrandom[mid]
powinien(*random)[mid]
using namespace std;
po<include>
sfirst
ilast
są błędne (powinny wynosić 0 i 99 zamiastrandom[0]
irandom[99]
źródło
first
ilast
są indeksami , a nie wartościami. Nie wiesz, co one reprezentują.Last
zatem podać ostatnią wartość wektora?Będziesz musiał przekazać wskaźnik do wektora, a nie sam wektor. Zwróć uwagę na dodatkowe „&” tutaj:
źródło
Przekazujesz wskaźnik,
*random
ale 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”
źródło
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.
źródło
Zwróć uwagę na
&
.źródło
Używasz argumentu jako odniesienia, ale w rzeczywistości jest to wskaźnik. Zmień
vector<int>*
navector<int>&
. I naprawdę powinieneś coś ustawićsearch4
przed użyciem.źródło
Jeśli używasz
random
zamiast* random
swojego kodu, nie podawaj żadnego błęduźródło