2016-02-19 20 views
10

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?

+4

"Sipariş önemli değil" - karar verdikten sonra "unordered_set" komutunu kullanın. Sipariş edilen konteynırların tek avantajı .. sipariş. –

+0

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

+2

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

cevap

6

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.

+1

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. –

+0

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 ' –

+0

' 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

İlgili konular