... aralıkların geçme seçeneğine sahip olmak kesinlikle faydalıdır. Ama en azından deneyimime göre, bu nadir görülen özel bir durum. Genelde bütün konteynerlerde çalışmak isterim
Deneyiminizde nadir görülen özel bir durum olabilir , ancak gerçekte tüm konteyner özel durumdur ve keyfi aralık genel durumdur.
Geçerli kapsayıcıyı kullanarak tüm konteyner durumunu uygulayabileceğinizi zaten farkettiniz , ancak görüşmeyi yapamazsınız.
Bu yüzden, kütüphane yazarı öndeki iki arayüzü uygulamak veya hala tüm vakaları kapsayan birini uygulamak arasında bir seçeneğe sahipti.
Konteynır alan ve çağrıları başlatan () ve end () üzerine sarılmış bir sarmalayıcı işlevi yazmak kolaydır, ancak bu kolaylık işlevleri standart kitaplığa dahil edilmez
Doğru, özellikle de serbest fonksiyonlar std::begin
ve std::end
şimdi dahil edilmiştir.
Öyleyse, kütüphanenin kolaylık aşırı yüklemesini sağladığını varsayalım:
template <typename Container>
void sort(Container &c) {
sort(begin(c), end(c));
}
Şimdi aynı zamanda bir karşılaştırma işlevini alan eşdeğer aşırı yükü sağlaması gerekiyor ve diğer tüm algoritmalar için eşdeğerleri sağlamamız gerekiyor.
Ama en azından tam bir konteynerde çalışmak istediğimiz her vakayı ele aldık, değil mi? Pek iyi değil. Düşünmek
std::for_each(c.rbegin(), c.rend(), foo);
Kaplarda geriye doğru işlem yapmak istiyorsak , mevcut algoritma başına başka bir yönteme (veya bir çift yönteme) ihtiyacımız var.
Dolayısıyla, menzil temelli yaklaşım basit anlamda daha geneldir:
- bütün konteyner versiyonunun yapabileceği her şeyi yapabilir
- Tüm konteyner yaklaşımı, hala daha az güçlü olmakla birlikte, gereken aşırı yük sayısını iki katına çıkarır veya üçe katlar.
- Menzil tabanlı algoritmalar da kompoze edilebilir (iterator adaptörlerini istifleyebilir veya zincirleyebilirsiniz, ancak bu daha yaygın olarak fonksiyonel dillerde ve Python'da yapılır).
Elbette, STL'nin standart hale getirilmesinin zaten çok fazla uğraştığı ve bunun yaygın bir şekilde kullanılmadan önce uygun ambalajlarla şişirilmesi, sınırlı bir komite zamanının büyük bir kullanımı olmazdı. Eğer ilgileniyorsanız, Stepanov & Lee'nin teknik raporunu burada bulabilirsiniz.
Yorumlarda belirtildiği gibi, Boost.Range , standartta değişiklik gerektirmeden daha yeni bir yaklaşım sunar.