Estou tentando enviar um vetor como argumento para uma função e não consigo descobrir como fazê-lo funcionar. Tentei de várias maneiras diferentes, mas todas fornecem mensagens de erro diferentes. Incluo apenas parte do código, pois é apenas essa parte que não funciona. (o vetor "aleatório" é preenchido com valores aleatórios, mas classificados entre 0 e 200)
Atualizado o código:
#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;
é uma má ideia. Por quê?Respostas:
Depende se você deseja passar o
vector
como referência ou como um ponteiro (estou desconsiderando a opção de passá-lo por valor como claramente indesejável).Como referência:
int binarySearch(int first, int last, int search4, vector<int>& random); vector<int> random(100); // ... found = binarySearch(first, last, search4, random);
Como um ponteiro:
int binarySearch(int first, int last, int search4, vector<int>* random); vector<int> random(100); // ... found = binarySearch(first, last, search4, &random);
Dentro
binarySearch
, você precisará usar.
ou->
acessar os membros derandom
correspondentemente.Problemas com seu código atual
binarySearch
espera umvector<int>*
, mas você passa umvector<int>
(faltando um&
antesrandom
)binarySearch
antes de usá-lo (por exemplo,random[mid]
deve ser(*random)[mid]
using namespace std;
depois do<include>
sfirst
elast
estão errados (devem ser 0 e 99 em vez derandom[0]
erandom[99]
fonte
first
elast
são índices , não valores. Você está confuso quanto ao que eles representam.Last
o último valor do vetor?Você terá que passar o ponteiro para o vetor, não o vetor em si. Observe o '&' adicional aqui:
fonte
Você está passando um ponteiro,
*random
mas o está usando como uma referência&random
O ponteiro (o que você tem) diz "Este é o endereço na memória que contém o endereço de aleatório"
A referência diz "Este é o endereço de aleatório"
fonte
Sempre que você ficar tentado a passar uma coleção (ou ponteiro ou referência a uma) para uma função, pergunte a si mesmo se não poderia passar alguns iteradores em vez disso. Provavelmente, ao fazer isso, você tornará sua função mais versátil (por exemplo, tornar trivial trabalhar com dados em outro tipo de contêiner quando / se necessário).
Nesse caso, é claro, não há muito sentido, já que a biblioteca padrão já tem uma pesquisa binária perfeitamente boa, mas quando / se você escreve algo que ainda não está lá, poder usá-lo em diferentes tipos de contêineres costuma ser bastante útil.
fonte
Observe o
&
.fonte
Você está usando o argumento como referência, mas na verdade é um ponteiro. Mude
vector<int>*
paravector<int>&
. E você realmente deve definirsearch4
algo antes de usá-lo.fonte
Se você usar em
random
vez do* random
seu código não dá nenhum errofonte