2011-05-12 17 views
5

Aşağıdaki kodu, örneğin, döngü olmadan bir STL algoritması kullanarak nasıl yeniden yazarım?Bir döngü olmadan bir STL algoritması kullanılarak yeniden yazılan işaretçiler kullanarak döngü örneği?

vector<double> pizzaBox; 
int biggestSlice = 0; 
for (int* p = &pizzaBox[0]; p != pizzaBox[pizzaBox.size()]; p++) { 
    if(*p > biggestSlice) 
     biggestSlice = *p; 
} 
+0

Bu özel algoritma ya da genel olarak herhangi bir döngü? –

+1

Vektörü yinelemelisiniz, altta yatan dizi değil: 'için (vektör :: iterator p = pizzaBox.begin(); p! = PizzaBox.end(); ++ p) '. Bu sadece vektör değil, her türlü konteyner (liste, harita, hash_map) için çalışacaktır. Yaptığınız şey, çalışmak için garantidir (çünkü, vektör elemanların sürekli bellekte saklanması için gereklidir), fakat resmi olarak tanımlanmamıştır. –

+1

Not: 'pizzaBox [pizzaBox.size()]' aslında tanımlanmamış bir davranıştır. Dizinin sonunun ötesinde bir öğeye erişiyorsunuz. Eğer 'pizzaBox.at (pizzaBox.size())' kullanırsanız, bir istisna atar. –

cevap

14

aslında vector<int> anlamına geldiğini varsayarsak, ve döngü bitiş durumunu düzelttikten sonra, buradan max_element algoritmayı kullanabilirsiniz: dolayısıyla ben,

int biggestSlice = *max_element(pizzaBox.begin(), pizzaBox.end()); 

( max_element bir yineleyici döndüren dikkat edin m biggestSlice'a atanmadan önce geri dönüşün silinmesi.)

Elbette artık işe yaramıyor (= tanımsız behavi verir Bizim vektör boş olduğunda. Bu açıkça için işlevinin işlevinin geri dönüşünü iptal etmeden önce sınamanız gerekir.

+5

'if (! PizzaBox.empty())', ancak daha sonra, sorgunun kodu aynı soruna sahiptir. –

+0

@Steve Geçerli yorum. –

+2

@Steve Jessop: OP sorusu, boş olmayan bir vektörle bile bu soruna sahip. –