Şahsen benim ilk okumam:
std::generate(numbers.begin(), numbers.end(), rand);
"Bir aralıktaki her şeye atıyoruz. Aralık. numbers
Atanan değerler rastgele" dir.
İlk okumam:
for (int& x : numbers) x = rand();
"Bir aralıktaki her şeye bir şeyler yapıyoruz. Aralık. numbers
Yaptığımız şey rastgele bir değer atamaktır."
Bunlar oldukça benzer, ancak aynı değil. İlk okumayı kışkırtmak isteyebilmemin makul bir nedeni, bence bu kodla ilgili en önemli gerçeğin aralığa ataması olduğunu düşünüyorum. İşte "neden isteyeyim ki ..." Kullanıyorum generate
çünkü C ++ ' std::generate
da "aralık ataması" anlamına geliyor. Btw'nin yaptığı gibi std::copy
, ikisi arasındaki fark atadığınız şeydir.
Yine de kafa karıştırıcı faktörler var. Aralık tabanlı döngülerin numbers
, yineleyici tabanlı algoritmalardan daha doğal olarak, aralığın olduğunu ifade etmenin daha doğrudan bir yolu vardır . Bu yüzden insanlar menzile dayalı algoritma kitaplıkları üzerinde çalışıyor: sürümden boost::range::generate(numbers, rand);
daha iyi görünüyor std::generate
.
Buna karşı, int&
menzile dayalı for döngüsünüzde bir kırışıklık var. Ya aralığın değer türü değilse int
, o zaman burada dönüştürülebilir olmasına bağlı sinir bozucu derecede ince bir şey yapıyoruz int&
, oysa generate
kod yalnızca rand
öğeye atanabilir olmanın getirisine bağlı . Değer türü olsa bile int
, hala olup olmadığını düşünmeyi bırakabilirim. Bu nedenle auto
, ben neyin atandığını görene kadar türleri düşünmeyi erteliyor - auto &x
"ne tür olursa olsun, aralık öğesine bir referans alın" diyorum. (Onlar olduğunuz işlevi şablonları için) idi Geri C ++ 03, algoritmalar kesin türlerini gizlemek için bir yol, şimdi onlar konum bir yol.
En basit algoritmaların eşdeğer döngülere göre yalnızca marjinal bir faydası olduğunu düşünüyorum. Aralık tabanlı döngü döngüleri, döngüleri iyileştirir (bundan biraz daha fazlası olmasına rağmen, temel olarak standart şablonun çoğunu kaldırarak). Dolayısıyla, kenar boşlukları daha sıkı çekilir ve belki bazı özel durumlarda fikrinizi değiştirirsiniz. Ama orada hala bir stil farkı var.