Как передать вектор в функцию? - PullRequest
77 голосов
/ 17 марта 2011

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

122 голосов
/ 17 марта 2011

Это зависит от того, хотите ли вы передать 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> (пропуская & до random)
  2. Вы не разыменовываете указатель внутри binarySearch перед его использованием (например, random[mid] должно быть (*random)[mid]
  3. Вы пропустили using namespace std; после <include> s
  4. Значения, которые вы присваиваете first и last, неверны (должны быть 0 и 99 вместо random[0] и random[99]
7 голосов
/ 17 марта 2011

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

found = binarySearch(first, last, search4, &random);
2 голосов
/ 17 марта 2011

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

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

2 голосов
/ 17 марта 2011

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

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

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

1 голос
/ 17 марта 2011
found = binarySearch(first, last, search4, &random);

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

0 голосов
/ 17 марта 2011

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

0 голосов
/ 17 марта 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...