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


86

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

1
Что вы имеете в виду под словом «не работает»? Пожалуйста, опубликуйте ошибки.
Дат Чу

1
В коде обновлений: параметры first и last являются значениями вектора, а не индексами. Вы также никогда не устанавливаете значение для поиска (search4)!
Bo Persson

1
Использование using namespace std;- плохая идея. Почему?
Tomask

Ответы:


132

Это зависит от того, хотите ли вы пройти 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]

«Значения, которые вы присваиваете первому и последнему, неверны (должны быть 0 и 99 вместо random [0] и random [99]»), но я хочу, чтобы «first» было первым значением в случайном порядке, а «last» было последний. Я не хочу, чтобы они были значениями 0 и 99.
Джо

Джо: firstи lastявляются индексами , а не значениями. Вы не понимаете, что они представляют.
Джон

Тогда как мне дать Lastпоследнее значение вектора?
Joe

о, извините, теперь я вижу свою ошибку. Спасибо!
Джо

1
@lecaruyer: Вкратце, передача по значению означает, что содержимое вектора должно быть копируемым, и фактически будет создана копия всего. На практике последствия этого могут варьироваться от незначительных до очень проблематичных с точки зрения производительности и / или ресурсов, до кода, который даже не компилируется. Нет причин делать это, если вы действительно не хотите получить вторую копию материала.
Джон

8

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

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

2

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

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

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


2

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

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



0

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


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.