Как передать вектор функции?

Я пытаюсь отправить вектор в качестве аргумента функции, и я не могу понять, как заставить его работать. Пробовал кучу разных способов, но все они дают разные сообщения об ошибках. Я включаю только часть кода, так как это только эта часть не работает. (вектор "случайный" заполняется случайными, но отсортированными значениями от 0 до 200)

Обновлен код:

#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

Это зависит от того, хотите ли вы передать vector в качестве ссылки или в качестве указателя (я не обращал внимания на возможность передачи его по значению как явно нежелательного).

В качестве справки:

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

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

В качестве указателя:

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

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

Внутри binarySearch вам нужно будет использовать . или -> для доступа к членам random соответственно.

Проблемы с вашим текущим кодом

  • binarySearch ожидает vector<int>*, но вы передаете vector<int> (отсутствует & до random)
  • Вы не разыскиваете указатель внутри binarySearch перед его использованием (например, random[mid] должен быть (*random)[mid]
  • Вам не хватает using namespace std; после <include> s
  • Значения, присваиваемые first и last, неверны (должны быть 0 и 99 вместо random[0] и random[99]

Ответ 2

Вам нужно будет передать указатель на вектор, а не на сам вектор. Обратите внимание на дополнительный '&' здесь:

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

Ответ 3

Вы передаете указатель *random, но используете его как ссылку &random

Указатель (что у вас есть) говорит: "Это адрес в памяти, который содержит адрес случайного"

В ссылке говорится: "Это адрес случайного"

Ответ 4

В любое время, когда возникает соблазн передать коллекцию (или указатель или ссылку на нее) функции, спросите себя, не могли ли вы передать пару итераторов. Скорее всего, вы сделаете так, чтобы ваша функция была более универсальной (например, сделать тривиально работать с данными в контейнере другого типа, когда это необходимо).

В этом случае, конечно, не так много смысла, поскольку стандартная библиотека уже имеет совершенно хороший двоичный поиск, но когда/если вы пишете то, что еще не существует, возможность использовать его на разных типах контейнеров часто бывает довольно удобно.

Ответ 5

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

Обратите внимание на &.

Ответ 6

Вы используете аргумент как ссылку, но на самом деле это указатель. Измените vector<int>* на vector<int>&. И вы действительно должны установить search4 на что-то, прежде чем использовать его.

Ответ 7

Если вы используете random вместо * random, ваш код не дает никакой ошибки