एक समारोह में एक वेक्टर पास कैसे करें?


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
अपडेट कोड पर: पहले और अंतिम पैरामीटर वेक्टर से मान हैं , इंडेक्स नहीं। आपने कभी भी खोज के लिए कोई मान सेट नहीं किया (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एक की उम्मीद है vector<int>*, लेकिन आप एक vector<int>( &पहले लापता random) में गुजरते हैं
  2. आप binarySearchइसका उपयोग करने से पहले सूचक को अंदर से नहीं हटाते हैं (उदाहरण के लिए, random[mid]होना चाहिए)(*random)[mid]
  3. आप एस के using namespace std;बाद गायब हैं<include>
  4. मूल्यों आप के लिए आवंटित firstऔर lastगलत हैं (0 हो सकता है और बजाय 99 चाहिए random[0]औरrandom[99]

"आपके द्वारा पहले और अंतिम को दिए गए मान गलत हैं (यादृच्छिक [0] के बजाय 0 और 99 होना चाहिए और यादृच्छिक [99]" - लेकिन मैं चाहता हूं कि "पहला" यादृच्छिक में पहला मान हो और "अंतिम" हो। पिछले एक। मैं नहीं चाहता कि वे 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 Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.