Como passar um vetor para uma função?


86

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

1
O que você quer dizer com não funciona? Publique os erros.
Dat Chu,

1
No código de atualizações: Os parâmetros primeiro e último são valores do vetor, não índices. Você também nunca define um valor para pesquisar (search4)!
Bo Persson,

1
Usar using namespace std;é uma má ideia. Por quê?
Tomask

Respostas:


132

Depende se você deseja passar o vectorcomo 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 de randomcorrespondentemente.

Problemas com seu código atual

  1. binarySearchespera um vector<int>*, mas você passa um vector<int>(faltando um &antes random)
  2. Você não desreferencie o ponteiro dentro binarySearchantes de usá-lo (por exemplo, random[mid]deve ser(*random)[mid]
  3. Você está faltando using namespace std;depois do <include>s
  4. Os valores que você atribui firste lastestão errados (devem ser 0 e 99 em vez de random[0]erandom[99]

"Os valores que você atribui ao primeiro e último estão errados (deve ser 0 e 99 em vez de aleatório [0] e aleatório [99]" - mas eu quero que "primeiro" seja o primeiro valor aleatório e "último" seja o último. Não quero que tenham os valores 0 e 99.
Joe,

Joe: firste lastsão índices , não valores. Você está confuso quanto ao que eles representam.
Jon

Então, como eu dou Lasto último valor do vetor?
Joe

oh, desculpe, vejo meu erro agora. Obrigado!
Joe

1
@lecaruyer: Resumidamente, passar por valor significa que o conteúdo do vetor deve ser copiável e uma cópia de tudo será realmente criada. Os efeitos disso podem, na prática, variar de insignificante a muito problemático do ponto de vista de desempenho e / ou recurso, para código que nem mesmo compila. Não há razão para fazer isso, a menos que você realmente queira uma segunda cópia do material.
Jon

8

Você terá que passar o ponteiro para o vetor, não o vetor em si. Observe o '&' adicional aqui:

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

2

Você está passando um ponteiro, *randommas 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"


2

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.



0

Você está usando o argumento como referência, mas na verdade é um ponteiro. Mude vector<int>*para vector<int>&. E você realmente deve definir search4algo antes de usá-lo.


Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.