Я пытаюсь отправить вектор в качестве аргумента функции и не могу понять, как заставить его работать. Пробовал кучу разных способов, но все они выдают разные сообщения об ошибках. Я включаю только часть кода, так как только эта часть не работает. (вектор "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);
}
using namespace std;
- плохая идея. Почему?Ответы:
Это зависит от того, хотите ли вы пройти
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>
sfirst
иlast
являются неправильными (должны быть 0 и 99 вместоrandom[0]
иrandom[99]
источник
first
иlast
являются индексами , а не значениями. Вы не понимаете, что они представляют.Last
последнее значение вектора?Вам нужно будет передать указатель на вектор, а не на сам вектор. Обратите внимание на дополнительный символ '&' здесь:
источник
Вы передаете указатель,
*random
но используете его как ссылку&random
Указатель (что у вас есть) говорит: «Это адрес в памяти, который содержит случайный адрес».
В ссылке написано "Это случайный адрес"
источник
Каждый раз, когда вы испытываете желание передать коллекцию (или указатель или ссылку на нее) функции, спросите себя, нельзя ли вместо этого передать пару итераторов. Скорее всего, тем самым вы сделаете свою функцию более универсальной (например, сделаете тривиальной работу с данными в другом типе контейнера, когда / если это необходимо).
В этом случае, конечно, нет особого смысла, поскольку в стандартной библиотеке уже есть отличный двоичный поиск, но когда / если вы пишете что-то, чего еще нет, возможность использовать это в разных типах контейнеров часто бывает очень удобно.
источник
Обратите внимание на расширение
&
.источник
Вы используете аргумент как ссылку, но на самом деле это указатель. Измените
vector<int>*
наvector<int>&
. И вы действительно должны установитьsearch4
что-то, прежде чем его использовать.источник
Если вы используете
random
вместо* random
своего кода, не выдает ошибокисточник