จะส่งเวกเตอร์ไปยังฟังก์ชันได้อย่างไร?


86

ฉันกำลังพยายามส่งเวกเตอร์เป็นอาร์กิวเมนต์ให้กับฟังก์ชันและฉันคิดไม่ออกว่าจะทำให้มันทำงานอย่างไร พยายามหลายวิธี แต่ทั้งหมดให้ข้อความแสดงข้อผิดพลาดที่แตกต่างกัน ฉันใส่โค้ดเพียงบางส่วนเท่านั้นเนื่องจากเป็นเพียงส่วนนี้ที่ใช้ไม่ได้ (เวกเตอร์ "สุ่ม" เต็มไปด้วยการสุ่ม แต่เรียงลำดับค่าระหว่าง 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
คุณหมายถึงอะไรไม่ทำงาน? กรุณาโพสต์ข้อผิดพลาด
Dat Chu

1
ในรหัสการอัปเดต: พารามิเตอร์แรกและตัวสุดท้ายคือค่าจากเวกเตอร์ไม่ใช่ดัชนี คุณไม่เคยตั้งค่าเพื่อค้นหา (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คาดว่า a 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 แทนที่จะสุ่ม [0] และสุ่ม [99]" - แต่ฉันต้องการให้ "แรก" เป็นค่าแรกในการสุ่มและ "สุดท้าย" เป็น อันสุดท้ายฉันไม่ต้องการให้เป็นค่า 0 และ 99
โจ

Joe: firstและlastเป็นดัชนีไม่ใช่ค่า คุณสับสนว่ามันเป็นตัวแทนของอะไร
จอน

แล้วฉันจะให้Lastค่าสุดท้ายของเวกเตอร์ได้อย่างไร?
โจ

โอ้ฉันขอโทษตอนนี้ฉันเข้าใจผิดแล้ว ขอขอบคุณ!
โจ

1
@lecaruyer: สั้น ๆ การส่งผ่านค่าหมายความว่าเนื้อหาของเวกเตอร์ต้องสามารถคัดลอกได้และสำเนาของทุกอย่างจะถูกสร้างขึ้นจริง ผลกระทบของสิ่งนี้ในทางปฏิบัติมีตั้งแต่เล็กน้อยไปจนถึงปัญหามากจากมุมมองของประสิทธิภาพและ / หรือทรัพยากรไปจนถึงโค้ดที่ไม่ได้รวบรวม ไม่มีเหตุผลที่จะทำเว้นแต่คุณจะต้องการสำเนาที่สองของสิ่งนั้นจริงๆ
จอน

8

คุณจะต้องส่งตัวชี้ไปที่เวกเตอร์ไม่ใช่เวกเตอร์เอง สังเกต '&' เพิ่มเติมที่นี่:

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

2

คุณกำลังส่งตัวชี้*randomแต่คุณกำลังใช้มันเหมือนข้อมูลอ้างอิง&random

ตัวชี้ (สิ่งที่คุณมี) ระบุว่า "นี่คือที่อยู่ในหน่วยความจำที่มีที่อยู่ของการสุ่ม"

ข้อมูลอ้างอิงระบุว่า "นี่คือที่อยู่ของการสุ่ม"


2

ทุกครั้งที่คุณถูกล่อลวงให้ส่งคอลเลกชัน (หรือตัวชี้หรืออ้างอิงถึงหนึ่ง) ไปยังฟังก์ชันให้ถามตัวเองว่าคุณไม่สามารถส่งซ้ำสองตัวแทนได้หรือไม่ มีโอกาสที่จะทำให้ฟังก์ชันของคุณมีความหลากหลายมากขึ้น (เช่นทำให้การทำงานกับข้อมูลในคอนเทนเนอร์ประเภทอื่นเป็นเรื่องเล็กน้อยเมื่อจำเป็น)

ในกรณีนี้แน่นอนว่าไม่มีประเด็นมากนักเนื่องจากไลบรารีมาตรฐานมีการค้นหาแบบไบนารีที่ดีอยู่แล้ว แต่เมื่อใด / ถ้าคุณเขียนสิ่งที่ยังไม่มีอยู่การใช้งานบนคอนเทนเนอร์ประเภทต่างๆมักมีประโยชน์มาก



0

คุณใช้อาร์กิวเมนต์เป็นข้อมูลอ้างอิง แต่จริงๆแล้วมันเป็นตัวชี้ เปลี่ยนvector<int>*เป็นvector<int>&. และคุณควรตั้งค่าsearch4เป็นบางอย่างก่อนใช้งาน


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.