Як передати вектор функції?


85

Я намагаюся надіслати вектор як аргумент функції, і я не можу зрозуміти, як змусити його працювати. Спробував купу різних способів, але всі вони дають різні повідомлення про помилки. Я включаю лише частину коду, оскільки лише ця частина не працює. (вектор "випадковий" заповнений випадковими, але відсортованими значеннями від 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)!
Бо Перссон,

1
Використання using namespace std;- погана ідея. Чому?
Томаск

Відповіді:


131

Це залежить від того, чи хочете ви передати його 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очікує a vector<int>*, але ти пропускаєш a 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]

"Значення, які ви призначаєте першому та останньому, є неправильними (має бути 0 і 99 замість випадкових [0] і випадкових [99]" - але я хочу, щоб "first" було першим випадковим значенням, а "last" - Я не хочу, щоб вони мали значення 0 і 99.
Джо

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

Тоді як мені дати Lastостаннє значення вектора?
Джо

ой, вибачте, зараз я бачу свою помилку. Дякую!
Джо

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.