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


Я пытаюсь отправить вектор в качестве аргумента функции, и я не могу понять, как заставить его работать. Перепробовал кучу разных способов, но все они дают разные сообщения об ошибках. Я включаю только часть кода, так как только эта часть не работает. (вектор "random" заполняется случайными, но отсортированными значениями от 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);
}
7 72

7 ответов:

это зависит от того, хотите ли вы передать 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 соответственно.

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

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

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

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

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

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

ссылка говорит: "Это адрес random"

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

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

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

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

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

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