Bir dizi işaretçim var. İlk adımda, veri işaretçileri ekliyorum ve ikinci adımda, tüm set üzerinde yineliyorum ve öğelerle bir şeyler yapıyorum. Sipariş önemli değil, sadece çiftleri önlemek gerekir, hangi işaretçi karşılaştırma ile iyi çalışıyor. Sorunun amacı, aynı amaç için sırasız bir kümenin kullanılması avantajlı olup olmadığıdır. Sırasız bir set için ekleme daha hızlı mı?Bir işaretçi kümesi için std :: set veya std :: unordered_set kullanmalı mıyım?
cevap
Ami Tavory'nin yorumunda, siparişe ihtiyacınız yoksa, sıralı olmayan kaplar için genellikle en iyisidir. Bunun nedeni, eğer bir şekilde bir şekilde performansı iyileştirirse, sıralanmamış konteynırlar onu kullanmakta özgür olacak ve dolayısıyla aynı ya da daha iyi karmaşıklığı elde edeceklerdir.
Sıralanmamış koleksiyonların bir dezavantajı, genellikle anahtar tipi için bir karma işlev gerektirmesidir. Birini yapmak çok zor veya pahalıysa, karmaları kullanmayan kaplar daha iyi olabilir. std::unordered_set
için O (1) var ise C++ 'ın Standart kütüphanesinde
, std::set
için ortalama ekleme karmaşıklığı, O (log (N)) olup. Bunun yanı sıra, std::unordered_set
kullanırken muhtemelen daha az önbellek kayıpları vardır.
Günün sonunda, bu sadece bir teori. Yeterince kulağa iyi gelen bir şey denemelisin ve gerçekten olup olmadığını görmek için profil yapmalısın.
Sorunun ne anlama geldiğini gösteren işaretçiler için standart kitaplıkta 'std :: hash'' uzmanlığı var, bu yüzden endişelenecek bir şey yok. –
Göz önünde bulundurulması gereken diğer bir konu ise, ilişkisiz işaretçilerin (aynı diziye veya aynı nesneye işaret etmemek) karşılaştırılmasının davranışının tanımsız olmasıdır. Yani, kesinlikle, std :: set ' –
' de işaretçileri saklamak için güvensiz. Karmaşıklıktan bahsetmişken: En kötü durum araması asıl soruyla alakalı değil, unordered_set için O (N) bir neden seçmek için bir sebep olabilir. bunun yerine sipariş verildi. * Sırasız olmayanlar için varsayılan bir başka argüman *, niyetin ifadesidir: okuyucu, siparişi önemsemediğinizi görür. – peterchen
- 1. Std :: stringstream önyükleme yapmalı mıyım?
- 2. Bir std :: use nullptr atamada kullanmalı mı?
- 3. Miras veya kompozisyon kullanmalı mıyım?
- 4. Std tuple'ını işaretçi haline getirme?
- 5. Javascript için getHours() veya getUTCHours kullanmalı mıyım?
- 6. std :: set yineleyici otomatik const
- 7. Kopyala std :: map for std :: set in C++
- 8. İşaretçi typedef neden std :: vector :: data()? std :: vektör API olarak
- 9. ApplyUpdates (0) veya ApplyUpdates (-1) kullanmalı mıyım?
- 10. Bu durumda Kalıtım veya Kompozisyon kullanmalı mıyım?
- 11. @ İmleci veya manifest dosyalarını kullanmalı mıyım?
- 12. Bu sınıfta kullanmalı mıyım?
- 13. Laravel'de belongsTo veya hasOne kullanmalı mıyım?
- 14. İşlevi std :: vektörüne bir işaretçi mi, yoksa std :: vektörüne bir başvuru döndürüyor mu?
- 15. Bu işaretçi std :: function'dan nasıl alabilirim?
- 16. Her tablo için bir CursorAdapter kullanmalı mıyım?
- 17. Bir Kullanıcı Denetimi için IDisposable kullanmalı mıyım?
- 18. Atışlı olmayan takas uygularken throw() kullanmalı mıyım?
- 19. Parametrelere bağlanırsam mysql_real_escape_string kullanmalı mıyım?
- 20. Saklı yordamı çalıştırmak için sp_executesql veya EXEC kullanmalı mıyım?
- 21. Android'de ImageCache'de saklamak için Bitmap veya Drawable kullanmalı mıyım?
- 22. std :: unordered_map bir std :: çifti ile
- 23. C++ - STD ::
- 24. std :: unordered_map için bir std :: tuple anahtarının kullanılması
- 25. std :: function ve std :: mem_fn
- 26. Bir Backround çalışanı kullanmalı mıyım veya kendi thread'ımı yazmalıyım
- 27. std :: bind2nd için bir yedek
- 28. std :: unique_ptr
- 29. İlişki veya İşaretçi?
- 30. std :: is_convertible type_info için
"Sipariş önemli değil" - karar verdikten sonra "unordered_set" komutunu kullanın. Sipariş edilen konteynırların tek avantajı .. sipariş. –
Kaç elemandan bahsediyoruz? Ve her bir öğe üzerinde yoğun bir çalışma yapıyor musunuz yoksa daha çok tüm öğeleri toplamak/çoğaltmak gibi mi? – MikeMB
Sipariş edilen konteynırlar, her işlem için zamanın O (lg n) olduğunu garanti etmediği için başka bir önemli avantaja sahipken, sırasız olanlar en kötü durumda O (n) gerektirir. Bu yüzden, suç hakkında söz vermek istiyorsanız, std :: set'i kullanın. – James