2014-12-30 23 views
5

std::map ile kullanılacak özel bir ayırıcının nasıl uygulanacağı hakkında bazı işaretçiler arıyorum. Konteynırdaki her öğe için bir tahsisat olmadan milyonlarca giriş içeren bir haritayı doldurmakla ilgileniyorum (bu kapsayıcı için varsayılan olan). Bunun nedeni, verileri bir grafiğin (QCustomPlot) depolanması için bir harita kullanan bir üçüncü taraf kitaplığına aktarmak ve büyük zaman serilerini çizerken performansın üstesinden gelmek olduğunu hissediyorum.Std :: map ile kullanılacak özel bir ayırıcı nasıl uygulanır?

std::map'un boyutu önceden biliniyorsa bunu bir tahsis ile yapmak mümkün müdür?

DÜZENLEME: Düğümler, kabın içine artan sırada beslenecektir.

+0

Belki bu sorularınızı cevaplıyor? http://stackoverflow.com/questions/13049340/initializing-a-stdmap-when-the-size-is-known-in-advance –

+1

Mümkün, ancak gereken boyutun bilinmeyeceğinin farkında olun '(sizeof (Key)) + sizeof (Değer)) * num_elem'. Bir dereceye kadar aşırı tahsis etmeniz gerekecek çünkü bir 'haritanın yapacağı ilk şeylerden biri' [rebind_alloc'] (http://en.cppreference.com/w/cpp/memory/allocator_traits) Her elemanı tutmak için kullandığı iç ağaç düğümü türü. Bunun dışında benim önerim, std :: allocator ve std :: allocator_traits belgelerini okumak ve daha sonra stdlib'in nasıl kullanıldığını incelemek (konuyla ilgili bir öğretici bulamadığınızı varsayarak). – Praetorian

+1

Grafikte görüntülenen şeyler genellikle doğada ardı ardına sıralanır, bu nedenle belki de boost :: flat_map (başlık altında sıralanmış bir vektördür) std :: map'den daha iyidir. –

cevap

1

Özel bir ayırıcının bu durumda yapabileceği tek şey, dahili boyut nedeniyle std :: haritasının son boyutunu ve ek yükünü biliyorsanız, hizalamanın neden olduğu varsayılan ayırıcı tarafından kullanılan ek yükün bazılarından kaçınmaktır. işaretçiler, gereken boyutta bir arabellek ayırabilir ve özel ayırıcıda tüm bu bitişik belleği kullanabilirsiniz.

Kaydedilecek bellek miktarı, haritanızda kullandığınız türlere bağlı olacaktır ve bunun çok fazla olacağını düşünmüyorum. OO Tiib yorumlarına belirtilen ve en iyi bahis dau_sama gibi

artırmak :: flat_map, ya da sen 3. parti lib değiştiremiyorsanız sadece Neyse bir

std::vector<std::pair<Key,Value>> 

aracılığıyla özel yapabilirdi ve sadece bir std :: map kabul edersiniz, uyum sağlayabileceğiniz bir tür yineleyici kabul etmedikçe hala şansınız kalmaz.

İlgili konular