2008-10-08 24 views
17

kullanarak konum STL bulma algoritması (ve min_element algoritması) kullanarak, bir vektörde minimum değerin konumunu bulmaya çalışıyorum, ancak, sadece geri veren değeri veren. E.g, eğer minimum değer ise, pozisyon 8 olarak iade edilecektir. Burada ne yapıyorum?Vektör içinde STL

int value = *min_element(v2.begin(), v2.end()); 
cout << "min value at position " << *find(v2.begin(), v2.end(), value); 
+0

sorunuzu bir yazım hatası vardır: Eğer bulmak istediğiniz demek muhtemelen yapmaya ne kast

Ancak, bunu kaldırma tarafından olsun yineleyici, karşılığını almak oldu * Minimum * değerini bulmaya çalışırken, bir vektördeki * maksimum * değeri. –

cevap

34

min_element zaten size yineleyici, (iki kez iş çünkü ilaveten, bu verimsiz) find çağırmak gerek verir. distance veya - operatörünü kullanın: Eğer dönüş yineleyicinızı kullandığınız

cout << "min value at " << min_element(v2.begin(), v2.end()) - v2.begin(); 
+0

LİSTEDE LÜTFEN AYNI OKUYUN, BAŞKA KAFAYI KAPATIN! NİYE YA? – prakharsingh95

+3

@ prakharsingh95 Kapak kilidini kullandığınızdan (ve cevabımı dikkatlice okumadığınız için - std :: distance işlevini deneyin). –

+0

Aha, özür dilerim. Neden böyle olduğunu düşündüğümde, mesafe operatörünün bağlantılı listelerde çalıştığını ve “O (n)” nin zaman karmaşıklığına sahip olacağını varsaydığımdan, “-” operatörüne bağlı kalmam gerektiğini anladım. Bağlı listelerde '-' uygulanmadığı için C++ STL'yi koruyarak, insanlara çok zaman kazandırıyor. – prakharsingh95

15

İkisi algoritmaları. Eğer değerini değil pozisyon yazdırmak neden

cout << "min value at position " << *find(v2.begin(), v2.end(), value); 

adımlayıcısı yaparken bir yineleyici KQUEUE, sen bu yineleyici tarafından "sivri" dir nesne, alırsanız can bir işaretçi olarak görülmelidir (tam olarak değil, fakat basitlik uğruna bunu söyleyelim); bu nedenle, yalnızca bir yineleyici size kaptaki pozisyonu veremez.

cout << "min value at " << min_element(v2.begin(), v2.end()) - v2.begin(); 

ama çok daha esnektir ve çalışacak std :: mesafe algoritmasını kullanarak öneriyoruz: Bir vektör yineleme yaptığınızdan, Konrad söylediği gibi sen, eksi operatörünü kullanabilirsiniz tüm standart konteynerleri:

cout << "min value at " << distance(v2.begin(), min_element(v2.begin(), v2.end())); 
+0

mesafeyi kullanarak bunu yapmak için doğru yolu olacaktır. Operatör kullanarak geri dönüş değerini yeniden boyutlandırdıktan sonra çok sayıda operatörün gerçek pozisyondan farklı olduğunu bir kez 'operator-' kullanarak bir problemi şifreledim. – Florian

+0

@Florian: "Operatör" ile yaşadığınız konu hakkında ayrıntılı bilgi verir misiniz? Bildiğim kadarıyla '' '' '' '' '' kullanmak için rasgele erişim iteratörleri ('' ''' ile verilenler gibi) için uzmanlaşır, bu yüzden bana farklı sonuçlar verebileceklerini şaşırtıyor. Bir "vektör" kullandığınızdan emin misiniz? –

7

sen nasıl ondan bir yineleyici verilen std::vector<> yılında konumunu belirleyen etmeyin" ile sorulan düşündüğün için kısa cevap ?" std::distance işlevidir.

using namespace std; 
vector<int>::const_iterator it = min_element(v2.begin(), v2.end()); 
cout << "min value at position " << distance(v2.begin(), it) << " is " << *it;