কোনও ফাংশনে ভেক্টর কীভাবে পাস করবেন?


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);
}

4
আপনি কাজ করে না মানে কি? ত্রুটি পোস্ট করুন।
ডেটা চু

4
আপডেট কোডে: প্রথম এবং শেষের পরামিতিগুলি ভেক্টরের মান , সূচি নয়। আপনি অনুসন্ধানের জন্য কখনই কোনও মান সেট করেননি (সার্চ 4)!
বো পারসন

4
ব্যবহার using namespace std;করা একটি খারাপ ধারণা। কেন?
টমাস্ক

উত্তর:


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একটি প্রত্যাশা করে 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ভেক্টরের শেষ মান দেব ?
জো

ওহ, আমি দুঃখিত, আমি এখন আমার ভুল ব্যবহার দেখছি। ধন্যবাদ!
জো

4
@ ক্যারুয়ায়ার: সংক্ষেপে, মূল্য দিয়ে যাওয়ার অর্থ হ'ল ভেক্টরের সামগ্রীগুলি অবশ্যই অনুলিপি-গঠনমূলক হতে হবে এবং সমস্ত কিছুর একটি অনুলিপি তৈরি করা হবে। অনুশীলনের ক্ষেত্রে এর প্রভাবগুলি নগন্য হতে, একটি কর্মক্ষমতা এবং / অথবা সংস্থান দৃষ্টিকোণ থেকে খুব জটিল, এমন কোড পর্যন্তও হতে পারে যা সংকলন করে না। আপনি যদি স্টাফের দ্বিতীয় কপি না চান তবে এটি করার কোনও কারণ নেই।
জন

8

আপনাকে পয়েন্টারটি ভেক্টরের কাছে দিতে হবে, ভেক্টর নিজেই নয়। অতিরিক্ত 'এবং' এখানে নোট করুন:

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

2

আপনি একটি পয়েন্টারে পাস করছেন *randomতবে আপনি এটি একটি রেফারেন্সের মতো ব্যবহার করছেন&random

পয়েন্টারটি (যা আপনার আছে) বলেছেন "এটি মেমরির ঠিকানা যা এলোমেলোভাবে ঠিকানা রাখে"

উল্লেখটি "এটি এলোমেলো ঠিকানা"


2

যে কোনও সময় আপনি কোনও ফাংশনে কোনও সংকলন (বা পয়েন্টার বা রেফারেন্স) পাস করার প্রলুব্ধ হন, নিজেকে জিজ্ঞাসা করুন আপনি এর পরিবর্তে কয়েকজন পুনরাবৃত্তি পাস করতে পারবেন না কিনা ask সম্ভাবনা হ'ল এটি করে আপনি আপনার ফাংশনটিকে আরও বহুমুখী করে তুলবেন (যেমন, / যখন প্রয়োজন হয় তখন অন্য ধরণের পাত্রে ডেটা নিয়ে কাজ করা তুচ্ছ করে তুলুন)।

এক্ষেত্রে অবশ্যই খুব একটা পয়েন্ট নেই যেহেতু স্ট্যান্ডার্ড লাইব্রেরিতে ইতিমধ্যে পুরোপুরি ভাল বাইনারি অনুসন্ধান রয়েছে, তবে / আপনি যদি এমন কিছু লিখেন যা ইতিমধ্যে নেই, বিভিন্ন ধরণের পাত্রে এটি ব্যবহার করতে সক্ষম হওয়া প্রায়শই বেশ কার্যকর।



0

আপনি যুক্তিটিকে একটি রেফারেন্স হিসাবে ব্যবহার করছেন তবে বাস্তবে এটি পয়েন্টার। পরিবর্তন vector<int>*করুন vector<int>&। এবং search4এটি ব্যবহার করার আগে আপনার কিছু সত্যই সেট করা উচিত ।


আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.