Her zaman ne yapmak istediğinizi en iyi açıklayan değişkeni kullanın . Yani
Her öğe için x
de vec
yapın bar.process(x)
.
Şimdi örnekleri inceleyelim:
std::for_each(vec.begin(), vec.end(),
std::bind1st(std::mem_fun_ref(&Bar::process), bar));
Biz var for_each
orada da - yippeh . [begin; end)
Üzerinde çalışmak istediğimiz ürün yelpazemiz var .
Prensip olarak, algoritma çok daha açıktı ve bu nedenle elle yazılmış herhangi bir uygulamaya göre tercih edilebilirdi. Ama sonra ... Bağlayıcılar? Memfun? Temelde bir C ++ interna nasıl üye fonksiyonu ele almak için? Görevim için onları umursamıyorum ! Ben de bu ayrıntılı, ürkütücü sözdiziminden muzdarip olmak istemiyorum.
Şimdi diğer olasılık:
for (std::vector<Foo>::const_iterator it = vec.begin(); it != vec.end(); ++it)
{
bar.process(*it);
}
Kabul edersek, bu tanımak için yaygın bir örüntüdür, ama ... yineleyiciler oluşturmak, döngü oluşturmak, arttırma, kayıttan kaldırma. Bunlar da görevimi yerine getirmek için umursamadığım şeyler .
Kuşkusuz, ilk çözümden daha iyi gözüküyor (en azından, döngü gövdesi esnek ve oldukça açık), ancak yine de, gerçekten o kadar büyük değil . Daha iyi bir imkanımız yoksa bunu kullanacağız, ama belki de ...
En iyi yol?
Şimdi geri dönelim for_each
. Yapılması gereken operasyonda tam anlamıyla söylemek for_each
ve esnek olmak harika olmaz mıydı ? Neyse ki, C ++ 0x lambdas'dan beri
for_each(v.begin(), v.end(), [&](const Foo& x) { bar.process(x); })
Birçok ilgili duruma soyut, genel bir çözüm bulduğumuza göre, bu özel durumda, mutlak bir # 1 favori olduğunu belirtmek gerekir :
foreach(const Foo& x, vec) bar.process(x);
Gerçekten bundan daha net olamaz. Neyse ki, C ++ 0x benzer benzer bir sözdizimi yerleşiktir !
map(bar.process, vec)
yan etkiler için harita önerilmez ve harita üzerinde liste kavrayışları / jeneratör ifadeleri önerilir).