Bir vektör bir işleve nasıl aktarılır?


86

Bir işleve argüman olarak bir vektör göndermeye çalışıyorum ve onu nasıl çalıştıracağımı bulamıyorum. Bir sürü farklı yol denedim ama hepsi farklı hata mesajları veriyor. Kodun sadece bir kısmını ekliyorum çünkü çalışmayan sadece bu kısım. ("rastgele" vektörü rastgele doldurulur, ancak 0 ile 200 arasındaki değerlerle sıralanır)

Kodu güncellendi:

#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
Çalışmıyor derken ne demek istiyorsun? Lütfen hataları gönderin.
Dat Chu

1
Güncelleme kodunda: İlk ve son parametreler , indekslerden değil vektörden alınan değerlerdir . Ayrıca (search4) aramak için asla bir değer ayarlamazsınız!
Bo Persson

1
Kullanmak using namespace std;kötü bir fikir. Neden?
maskelemek

Yanıtlar:


132

Bunu vectorbir referans olarak mı yoksa bir işaretçi olarak mı geçirmek istediğinize bağlıdır (açıkça istenmeyen olarak değerine göre geçirme seçeneğini göz ardı ediyorum).

Referans olarak:

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

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

İşaretçi olarak:

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

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

İçeride binarySearch, uygun şekilde üyelerini kullanmanız .veya bunlara ->erişmeniz gerekecektir random.

Mevcut kodunuzla ilgili sorunlar

  1. binarySearcha'yı bekler vector<int>*, ancak bir geçersiniz vector<int>(daha &önce bir eksik random)
  2. Sen işaretçi içini KQUEUE yok binarySearchkullanmadan önce (örneğin, random[mid]olmalı(*random)[mid]
  3. Sen eksik using namespace std;sonra <include>s
  4. Eğer atadığınız değerler firstve lastyanlış (0 olması ve yerine 99 olmalı random[0]verandom[99]

"İlk ve son olarak atadığınız değerler yanlış (rastgele [0] ve rastgele [99] yerine 0 ve 99 olmalıdır" - ancak "ilk" in rastgele ilk değer ve "son" un sonuncu. Bunların 0 ve 99 değerleri olmasını istemiyorum.
Joe

Joe: firstve lastolan endeksler , değil değerler. Neyi temsil ettikleri konusunda kafanız karıştı.
Jon

O Lasthalde vektörün son değerini nasıl vereceğim ?
Joe

oh, üzgünüm, yanlış yaptığımı şimdi görüyorum. Teşekkür ederim!
Joe

1
@lecaruyer: Kısaca, değerden geçmek, vektörün içeriğinin kopyalanabilir olması gerektiği ve her şeyin bir kopyasının gerçekten oluşturulacağı anlamına gelir. Bunun etkileri pratikte ihmal edilebilirden, performans ve / veya kaynak açısından çok sorunluya, derlenmeyen koda kadar değişebilir. Maddelerin ikinci bir kopyasını gerçekten istemediğiniz sürece bunu yapmak için hiçbir neden yok.
Jon

8

İşaretçiyi vektöre değil vektöre iletmeniz gerekecek. Buradaki ek '&' işaretine dikkat edin:

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

2

Bir işaretçiyi geçiyorsun *randomama onu bir referans gibi kullanıyorsun&random

İşaretçi (sahip olduğunuz) "Bu, rastgele adresi içeren bellekteki adres" diyor.

Referans "Bu rasgele adres" diyor


2

Bir işleve bir koleksiyon (veya bir işaretçi veya referans) iletmek istediğinizde, kendinize bunun yerine birkaç yineleyici geçip geçemeyeceğinizi sorun. Muhtemelen, bunu yaparak işlevinizi daha çok yönlü hale getireceksiniz (örneğin, gerektiğinde / gerektiğinde başka tür bir kaptaki verilerle çalışmayı önemsiz hale getirin).

Bu durumda, elbette, standart kütüphane zaten mükemmel derecede iyi ikili aramaya sahip olduğundan pek bir anlamı yoktur, ancak henüz orada olmayan bir şey yazarsanız / yazarsanız, onu farklı türdeki kaplarda kullanabilmek genellikle oldukça kullanışlıdır.



0

Argümanı referans olarak kullanıyorsunuz ama aslında bir gösterici. Değişim vector<int>*için vector<int>&. Ve search4kullanmadan önce gerçekten bir şeye ayarlamalısınız .


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.