2009-06-11 11 views
8

Basit testlerimden geliyor, ancak bunun garanti edilip edilmediğini merak ediyorum.Bir STL haritası her zaman start() 'dan bitiş()' e kadar devam ederken aynı sıralamayı veriyor mu?

Siparişin garanti edilmeyeceği durumlar var mı?

Edit: Özellikle ilgi duyduğum durum, çok sayıda giriş içeren bir haritayı doldurabildiğim durumdur, itertatörün sırası, benim uygulamamın birden çok çalıştırmasında aynı olur mu? Girişler farklı bir sıraya yerleştirilirse ne olur?

+0

, Liste benzeri bir yapı kullanmamalısınız? Tanım gereği bir harita, değerlerin anahtarlarının çevrilmesiyle belirlenen konumlara yerleştirilmesinden beri bir sıralamaya sahip değildir. – Gishu

+1

Sipariş ve sıralama arasındaki farka dikkat edin. Liste, vektör ve dequeue sıralı konteynırlardır. Set ve harita kaplar sipariş edilir. – Flame

cevap

9

Evet, içsel bir sıraya sahiptir, bu nedenle değişmeyen bir kümede yineleme her zaman aynı olmalıdır. here Gönderen:

Dahili olarak, harita öğeler inşaat ayarlanmış belirli bir katı zayıf sipariş kriter aşağıdaki yüksek tuş değere düşük doğru sıralanır.

+0

glibc'de kırmızı-siyah bir ağaçtır. Kesin sipariş STL spesifikasyonlarında olmamakla birlikte, fiili standarttır. –

+0

@Jeffamaphone Ve anahtarınız bir nesnenin işaretçisiyse, programınızın birden çok çalıştırması boyunca herhangi bir sıralama emri alabilirsiniz .... iyi de o zaman bunu açıklamıyor :) –

+0

@Jamie Cook: Teknik olarak, işaretçiler geçerli olmayan anahtarlar (en azından varsayılan std :: daha az bir karşılaştırıcı ile) çünkü imleçler için tanımlanmış bir operatör yoktur (ancak imzasız uzun bir süreye çevirerek sahte yapabilirsiniz). –

0

Bir STL haritası değişmezse başlangıç ​​/ bitiş ile aynı sıralamayı verir mi? Evet. Haritayı değiştirirseniz, aynı kalan siparişe bağlı kalmayın.

+0

... ama değişmemiş elemanların sıralaması aynı kalıyor - herhangi bir ekleme veya delesyon, tanımlanan sipariş ilişkisine göre dizideki uygun yere yansıtılacaktır. Yani, haritadaki değişiklikler yineleme sırasını tamamen öngörülebilir yollarla değiştirecektir. –

-2

Aynı veri STL uygulamasında aynı veri seti üzerinde, evet. Farkına vardığım kadar farklı uygulamalarda aynı olmayacağı garanti edilmez.

+1

Karşılaştırıcının geçerli bir zayıf zayıf sipariş vermesi koşuluyla, tüm uygulamalarda aynı olması garanti edilir - aksi halde tüm bahisler kapalıdır! –

+0

Öyle değil mi? :) –

6

std::map evet, sipariş (eğer onun kurucu örtük veya açık kullanmak sipariş ile aynı) garanti, bir konteyner sıralanmış, yani. (hashmap) popüler (ancak-henüz-stanard) bunun için saymak olsa da - birçok durumda wT std::map, ama iterasyon öngörülebilir bir sipariş değil!

+1

C++ 0x'de karma tabanlı harita/set unordered_map/unordered_set olarak adlandırılır. Sipariş edilmemek konusunda oldukça açık. – Flame

1

std :: map sıralanmış bir koleksiyon
olduğunu ve daha az
m tipi T bir haritasıdır hayal operatöre daha tanımlamak zorunda kalacak: Eğer elemanların garantili sipariş gerekiyorsa

assert(m.size() > 1); 
for (std::map<T>::const_iterator i = m.begin(); i != m.end(); ++i) { 
    std::map<T>::const_iterator j = i + 1; 
    while (j != m.end()) { 
     assert(*i < *j); 
     ++j; 
    } 
} 
İlgili konular