2013-08-11 27 views
5

Lambda ifadelerinin nedeni, "daha uygun bir şekilde" örtük olarak işlev nesneleri oluşturur. Aşağıdaki örnekte gördüğünüz gibi, sadece daha az uygun ve uzun değil, aynı zamanda kafa karıştırıcı bir sözdizimi ve notasyonu da var."Lambda ifadeleri" nin avantajı nedir?

bunların hiçbirini kullanımları var mı, aslında kod daha okunaklı hale getirir nerede? böylelikle değişmeden kod doğal üst tırnağa akışını sürdürmenin doğru denir noktaya fonksiyonunun uygulanmasını yerleştirir çünkü

cout << count(vec, [&](int a){ return a < x; }) << endl; // lambda 
cout << count(vec, Less_than<int> (x)) << endl;   // normal functor def-n 
+3

Lambda sürümü daha uzun değil. “Less_than” tanımına sahip olmadığımız için, lambda olmayan bir eksiktir. –

+0

Bu nasıl olur? Less_than (x) 'a" normal işlev tanımı "??? İlk örneğinize bakacak olursak, x parametresinin değerini iki parametreli bir karşılaştırıcıya dönüştürerek tek bir parametre karşılaştırıcısına dönüştürmeniz gerekir. Bu zaten "normal işlev tanımı" nın çok ötesine geçen bir işlevdir. – AnT

cevap

10

Daha okunabilir. Görüyorsunuz

, sıradan fonksiyonları kendi artıları ve eksileri var. Bir yandan, işlevler koddaki tekrarların azaltılmasına yardımcı olur, bu da kodu daha yapılandırılmış ve daha okunabilir hale getirir. Diğer taraftan, işlevler doğal kod akışını ve aktarım denetimini tamamen farklı bir yere koparır. Bu oldukça açık nedenlerle okunabilirliği azaltabilir: iç içe geçmiş ve geriye dönük referanslarla dolu bir kitap okumak gibidir.

Yani, düzgün sıradan fonksiyonların özellikleri yararlanmak amacıyla, tek iyi düşünülmüş aracılığıyla, tam ve izole soyutlamalar uygulamak için bunları kullanmak gerekir. Bu şekilde normal işlevler kodun okunabilirliğini artıracaktır.

Ancak küçük "tek kullanımlık" tek kullanımlık yarar kodu için

, sıradan fonksiyonlar çok iyi çalışmaz. Aslında kodu çok daha az okunabilir hale getirebilirler. Lambda fonksiyonlarının devreye girdiği yer burasıdır. Tek kullanımlık yardımcı kodun, gerekli olduğu yerde doğrudan çağrı noktasına enjekte edilmesine izin verir.

+0

Ek bir nokta, lambda işlevlerinin ana bağlamda kapsam dahilindeki değişkenlere doğrudan erişebilmeleridir (bu durumda, lambda gerektiğinde doğrudan "vec" ye erişebilir). Ayrı bir işlev yapmak. –

1

lambda ifade kodu basitleştirmek için vardır. Bu:

auto fun = []() { return; }; 

ile derleyici yerini mi:

// Namespace scope 
struct __lambda_1 { 
    void operator()() { return; } 
}; 

// local scope 
__lambda_1 fun{}; 

Bu lambda sözdizimi için birincil motivasyon geçerli: Geleneksel fonksiyon sitesinde nerede ilan anonim işlev okumak için daha kolay nesneleri değiştirmek için Başka bir kapsamda bildirilmesi gereken ayrı bir işlev nesnesine sahip olmak yerine, gereklidir. Sadece adlandırılmış işlev nesnelerini değiştirmek değildir.

Nitekim standart kütüphane adlı fonksiyonun bir dizi gibi std::less gibi std::unary_function ve şeyleri nesneleri içerir. Fakat bu nesneler sınırlı bir faydaya sahiptir ve bir lambda'nın yapabileceği her potansiyel rolü üstlenemez.

Evet, standart kitaplığın gerekli olduğu yerde tam olarak sağlamadığı bir kod yerleştirerek, kodunuzu düzine satır struct s ile kirletmeden ve ad alanınızı adlarınızla kirleterek kodun büyük ölçüde okunabilir hale getirilmesini sağlayabilirsiniz. muhtemelen bir veya iki kereden fazla kullanmayın.

İlgili konular