Veri yapısını geçmek için bellek ayırmanın gerekli olduğu standart bir yineleyici düşünün. Standart, bellek atanamazsa yineleyicinin bir istisna atmasına izin veriyor mu? Örnek olarak, ağaç veri yapıları için bir giriş yineleyici düşünün. Bu durumda, ağacın üstesinden gelmek için, her düğümün üst öğesine bir işaretçi eklemeniz ve sürdürmeniz gerekir (bu, ağaçta ekleme/silme/bulma hakkında olduğu gibi bu tür bir işaretçiye ihtiyaç duymayan işlemleri yavaşlatır) veya bir yığın kullanır. Yineleyicinin, işaretçileri çapraz düğümlere depolamasına yardımcı olmak için. Bu durumda, yığın ilerlerken boş bellek kalmayıncaya ve yineleyici atmaya zorlanana kadar büyüyebilir.Standart yineleyici işlemlerinin atmasına izin verilir mi?
cevap
Evet, C++ uygulamasında bir yineleyici yönteminin atmasına izin verilir ve belirttiğiniz gibi bazı durumlarda atılabilir.
C++ 'da atamayacağınız işlevlerin tek sınıfı bir yıkıcıdır. Ve gerçekten bu sadece bir sözleşmeyle (çünkü belirli işlemleri doğru yapmak neredeyse imkansız hale getirir). Destraktörler atabilir, bırakmaları için çok kötü.
Bireysel işlevler, atmalarını önlemek için throw()
ile işaretlenebilir.
"C + + 'da atanamayan tek işlev bir yıkıcıdır." Doğru değil. Standart, atmasına izin verilmeyen oldukça az sayıda standart kütüphane fonksiyonunu tanımlar. Örneğin, "auto_ptr" yapıcılarının çoğu C++ 03'te "throw()" olarak adlandırılırlar, yani atılamazlar. C++ 11'de hemen hemen her "swap" uygulaması "noexcept" ile tanımlanır. –
@NicolBolas Bir sınıfın/işlev türünün atılmasına izin verilip verilmediğine dair genel bir açıklama yapmaya çalışıyordum. Throw() 'değiştiricisi kesinlikle bireysel bir fonksiyonun atamayacağını söylüyor. Bununla ilgili bir not ekleyeceğim. "Noexcept" ile aşina değilim, bunun için iyi bir referans sayfanız var mı? – JaredPar
@JaredPar: C++ 11'de tanıtılan yeni sözdizimi. Hangi Visual C++ şimdiye kadar göz ardı edilmiş olsa da, uygulanacak en kolay şeylerden biri olması gerekir (neredeyse 'throw() '+ tipte bir özellik). C++ 11 Standardının 15.4 ve 5.3.7 bölümlerine bakınız. –
- 1. İsimsiz işlevlere izin verilir mi?
- 2. İptables'lerden postaya nasıl izin verilir?
- 3. CQRS - okuma tarafını okuma tarafından aramasına izin verilir mi?
- 4. Katman barındırma NSView'larının alt görüntülere sahip olmasına izin verilir mi?
- 5. std :: enable_shared_from_this: destroctor'da shared_from_this() öğesini çağırmasına izin verilir mi?
- 6. Rust, vektör bir yineleyici mi?
- 7. Orta Güven'de Hangi Yansıma İzinlerine İzin Verilir?
- 8. PostgreSQL veritabanına Uzaktan Erişim Nasıl İzin Verilir
- 9. Nasıl referans verilir. T4 dosyasında standart mı?
- 10. Belirli html etiketlerine nasıl izin verilir?
- 11. HTML özellik adına hangi karakterlere izin verilir?
- 12. Görünümün sonsuza dek nasıl döndürülmesine izin verilir?
- 13. gdb adresinde belirtilen talimatlara nasıl izin verilir?
- 14. javascript regex: yalnızca ingilizce harflere izin verilir
- 15. Firefox'taki bağlantıların klavye odaklarına nasıl izin verilir?
- 16. Sıfır değerin tekrarlanmasına nasıl izin verilir?
- 17. DataGridViewComboBox - Herhangi bir değere nasıl izin verilir?
- 18. PSR-2 if-statement - neye izin verilir?
- 19. Python yineleyici yapmak geriye mi gidiyor?
- 20. searchd.development.pid.lock izin mi?
- 21. file_put_contents izin reddedildi mi?
- 22. PayPal işlemlerinin listesi
- 23. Yineleyici davranış
- 24. Temin otomatik olarak ip değiştirmesine nasıl izin verilir?
- 25. Yakut/Erb ne tür HAML içeride izin verilir: javascript filtre?
- 26. Bir kullanıcının C# içindeki bir dosyaya göz atmasına izin vermenin en iyi yolu nedir?
- 27. Tüm durumlarda, shared_ptr yapımı için ham işaretçiye neden izin verilir?
- 28. C++ 'da, yalnızca sanal olmayan yöntemler ekleyen türetilmiş bir sınıfa yayınlanmasına izin verilir mi?
- 29. android createTempFile izin reddedildi mi?
- 30. Regex e-posta - e-postada artı sembollere nasıl izin verilir?
"Bu durumda, ağacın üstesinden gelmek için, her düğümün üst öğesine bir işaretçi eklemeniz ve korumanız gerekir" Her düğümün * ebeveynine bir işaretçi göstermesi gerekir. Aksi halde sadece aşağı inebileceğiniz "ileri" bir ağaç. Yığını kullanan bir yineleyicinin, hem genel hem de paylaşılan bir nesneye (dolayısıyla iş parçacığı için güvenli olmayan) güvenmek ve yalnızca ağacı çaprazlamak için bellek ayırmak için kırılacağını söyleyebilirim. C++ 11'deki "std :: forward_list" için yineleyicilerin ileri yineleyiciler olduğunu unutmayın; sen hiç geri dönemezsin. –
@Nicol Yığının global olacağını veya paylaşılacağını kim söyledi? Yığın yineleyici örneğiyle ilişkilendirilir. Dahası, yığınlar, düğümlerin yalnızca halefleri için işaretçilere sahip olduğu ağaçlara * giriş yineleyicileri * uygulamak için tek yoldur. – Martin
Giriş yineleyicileri * veri yapısına * eleman eklemezler. Sadece var olan elemanları okuyabilir ve değiştirebilirler. Çıkış yineleyicileri yapabilir, ancak bunların çoğunun yineleme değil, * kapsayıcılar için yineleyici bağdaştırıcı olduğunu fark edersiniz. Ve ağaç düğümleri ebeveynlerine işaret etmelidir. –