Как передать вектор в функцию?
Я пытаюсь отправить вектор в качестве аргумента функции, и я не могу понять, как заставить его работать. Перепробовал кучу разных способов, но все они дают разные сообщения об ошибках. Я включаю только часть кода, так как только эта часть не работает. (вектор "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 ответов:
это зависит от того, хотите ли вы передать
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>
(отсутствует a&
доrandom
)- вы не разыменовываете указатель внутри
binarySearch
перед его использованием (например,random[mid]
должно быть(*random)[mid]
- вы пропали без вести
using namespace std;
после<include>
s- значения, которые вы назначить
first
иlast
неправильно (должно быть 0 и 99 вместоrandom[0]
иrandom[99]
вы должны передать указатель на вектор, а не сам вектор. Обратите внимание на дополнительные '&' здесь:
found = binarySearch(first, last, search4, &random);
вы передаете указатель
*random
но вы используете его как ссылку&random
указатель (что у вас есть) говорит: "Это адрес в памяти, который содержит адрес случайного"
ссылка говорит: "Это адрес random"
всякий раз, когда вы испытываете желание передать коллекцию (или указатель или ссылку на нее) в функцию, спросите себя, не могли бы вы передать пару итераторов вместо этого. Скорее всего, сделав это, вы сделаете свою функцию более универсальной (например, сделаете ее тривиальной для работы с данными в другом типе контейнера, когда/если это необходимо).
в этом случае, конечно, нет особого смысла, так как стандартная библиотека уже имеет совершенно хороший двоичный поиск, но когда/если вы что-то пишете этого еще нет, возможность использовать его на разных типах контейнеров часто довольно удобна.