2011-06-08 24 views
14

Olası Çoğalt:
A std::map that keep track of the order of insertion?STL Konteyner verir hayır çiftleri

ben ekleme sırasını (sıralama yok) korur, ancak does bir STL kapsayıcı için arıyorum kopyalara izin vermez. Biri var mı bir tane özelleştirmek için kullanabileceğim hile yok mu?

+0

Bu kapsayıcı yalnızca yeni elemanlar alacak mı yoksa öğelerin silinmesine de izin vermeli mi? – sep

+0

Ekleme sırasını koruduğunu söylediğinde, muhtemelen bunu yinelemek istersiniz. İlkinden sonuncuya mı yoksa tersine mi dönmek istersin? – sep

+0

Bir kez (silme yok) ekleyeceğim ve okuyucuyu (elemanlar üzerinde yinelemeli) birçok kez – krisostofa

cevap

8

Şu anda böyle bir kap yoktur, ancak bir sınıfa birlikte bir std::vector ve bir std::set tutarak kendi hesabınızı ucuz bir şekilde oluşturabilirsiniz.

+1

Nesneleriniz büyükse, işaretleyicileri kapsayıcıların içinde saklamayı düşünün ve kendi sıralama işlevinizi ayarlanan ctr'e iletin. –

+1

İyi öneri. Nesneler, bunların iki kopyasını istemediğiniz kadar büyükse, kümedeki nesneleri ve işaretçileri veya yineleyicileri, vektördeki ayarlanmış öğelere taşıyabilirsiniz. –

+0

@RC: Benim önerim ideal değil, çünkü nesneler aslında iki kez depolanıyor. Çok daha iyi bir çözüm, konteynırları gerekli özelliklerle sıfırdan oluşturmak olacaktır. Ancak yeni bir konteynır yazmak daha fazla çaba gerektiriyor. – Vlad

1

Bir tane yok. Çoğalmaları sıralamak veya parçalamaksızın tespit etmek oldukça pahalı bir işlemdir.

+0

std :: set öğeleri sıralar, değil mi? –

+3

@Gunner Ama aynı zamanda sıralar. Nemanja'nın söylediği gibi. –

2

Tekerleği yeniden icat etmeye gerek yok, bir boost::multi_index konteynırı kullanmayı düşünün. Daha sonra, kalbin içeriğine çeşitli dizinler tanımlayabilirsiniz. Performans farkı (endişeliyseniz) minimum düzeyde olmalıdır.

6

Özellikle bir STL konteynırı için sormuş olduğunu biliyorum, ancak boost zaten multindex konteynerini sağlar, order_unique dizini ile ne yaparsınız. Direksiyonu yeniden icat etmek yerine kesinlikle bakmaya değerim.

Sadece iyi bir alternatif önermek istedim.

İyi şanslar.