Làm thế nào để truyền một vectơ cho một hàm?


85

Tôi đang cố gắng gửi một vectơ dưới dạng đối số cho một hàm và tôi không thể tìm ra cách làm cho nó hoạt động. Đã thử rất nhiều cách khác nhau nhưng chúng đều đưa ra các thông báo lỗi khác nhau. Tôi chỉ bao gồm một phần của mã, vì chỉ có phần này không hoạt động. (vectơ "ngẫu nhiên" được lấp đầy bằng các giá trị ngẫu nhiên, nhưng được sắp xếp, từ 0 đến 200)

Đã cập nhật mã:

#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
Ý bạn là gì không hoạt động? Vui lòng đăng lỗi.
Dat Chu

1
Trên mã cập nhật: Các tham số đầu tiên và cuối cùng là các giá trị từ vectơ, không phải chỉ mục. Bạn cũng không bao giờ đặt giá trị để tìm kiếm (search4)!
Bo Persson

1
Sử dụng using namespace std;là một ý tưởng tồi. Tại sao?
Tomask

Câu trả lời:


131

Nó phụ thuộc vào việc bạn muốn chuyển vectordưới dạng tham chiếu hay dưới dạng con trỏ (tôi đang bỏ qua tùy chọn chuyển nó theo giá trị rõ ràng là không mong muốn).

Như một tài liệu tham khảo:

int binarySearch(int first, int last, int search4, vector<int>& random);

vector<int> random(100);
// ...
found = binarySearch(first, last, search4, random);

Như một con trỏ:

int binarySearch(int first, int last, int search4, vector<int>* random);

vector<int> random(100);
// ...
found = binarySearch(first, last, search4, &random);

Bên trong binarySearch, bạn sẽ cần sử dụng .hoặc ->truy cập vào các thành viên của randomtương ứng.

Vấn đề với mã hiện tại của bạn

  1. binarySearchmong đợi a vector<int>*, nhưng bạn vượt qua vector<int>(thiếu a &trước đó random)
  2. Bạn không bỏ qua con trỏ bên trong binarySearchtrước khi sử dụng nó (ví dụ: random[mid]phải(*random)[mid]
  3. Bạn mất tích using namespace std;sau <include>s
  4. Các giá trị bạn gán firstlastsai (phải là 0 và 99 thay vì random[0]random[99]

"Các giá trị bạn gán cho đầu tiên và cuối cùng là sai (phải là 0 và 99 thay vì ngẫu nhiên [0] và ngẫu nhiên [99]" - nhưng tôi muốn "đầu tiên" là giá trị đầu tiên trong ngẫu nhiên và "cuối cùng" là cuối cùng. Tôi không muốn chúng là các giá trị 0 và 99.
Joe

Joe: firstlastchỉ mục , không phải giá trị. Bạn bối rối không biết chúng đại diện cho những gì.
Jon

Sau đó, làm thế nào để tôi cung cấp Lastgiá trị cuối cùng của vectơ?
Joe

Ồ, tôi xin lỗi, tôi thấy lỗi của mình bây giờ. Cảm ơn bạn!
Joe

1
@lecaruyer: Nói một cách ngắn gọn, việc chuyển theo giá trị có nghĩa là nội dung của vectơ phải là bản sao-tạo và một bản sao của mọi thứ sẽ thực sự được tạo. Các tác động của điều này trong thực tế có thể từ không đáng kể, đến rất có vấn đề từ quan điểm hiệu suất và / hoặc tài nguyên, đến mã thậm chí không biên dịch. Không có lý do gì để làm điều đó trừ khi bạn thực sự muốn có bản sao thứ hai của nội dung.
Jon

8

Bạn sẽ phải chuyển con trỏ tới vectơ, không phải chính vectơ. Lưu ý thêm '&' ở đây:

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

2

Bạn đang chuyển một con trỏ *randomnhưng bạn đang sử dụng nó như một tham chiếu&random

Con trỏ (những gì bạn có) cho biết "Đây là địa chỉ trong bộ nhớ có chứa địa chỉ ngẫu nhiên"

Tham chiếu cho biết "Đây là địa chỉ của ngẫu nhiên"


2

Bất cứ khi nào bạn muốn chuyển một tập hợp (hoặc con trỏ hoặc tham chiếu đến một) cho một hàm, hãy tự hỏi mình xem liệu bạn có thể chuyển một vài trình vòng lặp thay thế hay không. Rất có thể bằng cách làm như vậy, bạn sẽ làm cho hàm của mình linh hoạt hơn (ví dụ: làm cho việc làm việc với dữ liệu trong một loại vùng chứa khác trở nên đơn giản hơn khi / nếu cần).

Trong trường hợp này, tất nhiên, không có nhiều điểm vì thư viện tiêu chuẩn đã có tính năng tìm kiếm nhị phân hoàn toàn tốt, nhưng khi / nếu bạn viết thứ gì đó chưa có ở đó, việc có thể sử dụng nó trên các loại vùng chứa khác nhau thường khá tiện dụng.



0

Bạn đang sử dụng đối số làm tham chiếu nhưng thực ra nó là một con trỏ. Thay đổi vector<int>*thành vector<int>&. Và bạn thực sự nên thiết lập search4một cái gì đó trước khi sử dụng nó.


0

Nếu bạn sử dụng randomthay vì * randommã của bạn, không có bất kỳ lỗi nào

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.