2009-11-27 13 views
6

almak :: yaparak haritayı en fazla n unsurlar .nasıl bir std ilk n elemanlarından :: haritası

bariz çözüm n 0 ile bir halka oluşturabilir ve std için birinci parametrenin :: Silme() olarak inci yineleyici kullanmaktır.

döngü (en azından benim kullanıcı kodu) eksik olduğu ve daha fazlası "gitmek STL yolu" dır olmayan herhangi bir çözüm olup olmadığını merak ediyorum.

+1

Hmm .. Bir yineleyici döngüsü kullanmanın * olduğunu söyleyebilirim * * STL yolu gitmiyor, değil mi? – schnaader

+2

"std :: silme" yoktur. 'Std :: map :: delete()' –

cevap

13

Bunun için std::advance(iter, numberofsteps) kullanabilirsiniz.

+0

+1 - bunu bilmiyordum - güzel olanı. – schnaader

0

Neden bir haritayı yeniden boyutlandırmak istersiniz? Bir haritadaki

elemanları herhangi bir sırada saklanmaz -

düzenlemek ilk 'n' gerçekten bir şey anlamına gelmez:
İlginçtir std :: map bir emir var, emin değilim ne kadar yararlı bu kavramdır.
Girişler anahtarlar ile aynı sıralama düzeninde mi?
Bu ne anlama geliyor? SSN ile tuşlanan İsimleriniz varsa, bu isimler SSN sayısal düzeninde saklanıyor demektir?

+0

tuşlarını kullanın. –

+0

Düşündüğünüz şekilde değil, öğeler hafızada bir sırada. Anahtarı bir dizine dönüştüren bir karma algoritması vardır. Ancak, key1 ve key2 öğeleri zorunlu olarak birbirinin yanında değildir. –

+3

@mgb Hayır, bu bir karma masa olurdu. Bir std :: map ikili bir arama ağacıdır (genellikle kırmızı-siyah bir ağacın spesifik olması). Bir std :: haritasındaki öğeler bu nedenle, kolay ve hızlı bir şekilde yineleme yapan bir şekilde saklanır. – Tim

1

A std :: harita bir liste değildir. "İlk n" elemanları yoktur.

BTW: Kapsayıcı değiştiyse yineleyiciler geçersiz olur. Eğer gerçekten daha küçük bir harita gerekiyorsa

bunu gerçi yineleme ve yeni bir harita haline n-inci tüm unsurları toplanabilir. Böyle std :: listede, std :: map olarak hemen hemen her kap için

+3

Eh, elemanlar anahtarlarına göre sıralanırlar değil mi? – Nailer

+0

@Nailer: Güzel, bunu bilmiyordum. Bu bağlantı şunları onaylar: http://www.cplusplus.com/reference/stl/map/ – ya23

+1

Evet, öyle. Ancak bir harita "büyük olasılıkla (dengeli) bir düğüm ağacı" (quot "C++ programlama dili", Bjarne Stroustrup), bir liste değil. Yani mymap [n] hiçbir anlam ifade etmiyor. – EricSchaefer

3

Evrensel çözüm, artırmak :: multi_index. Haritanızın boyutunu yalnızca kontrol etmelisiniz.

template<class It> 
It myadvance(It it, size_t n) { 
    std::advance(it, n); 
    return it; 
} 

template<class Cont> 
void resize_container(Cont & cont, size_t n) { 
    cont.erase(myadvance(cont.begin(), std::min(n, cont.size())), 
       cont.end()); 
} 
+0

boş std :: advance(), bu yüzden bu derleme yapmadı. – Norbert

+0

Sağ. Tamir ettim. –

+0

+1, ancak bunu serbest bırakmak için düzenliyor olsaydınız, resize “resize_container” kavramı üzerinde çalıştıklarını düşünmeniz gerekirdi. İşlev ve şablon parametre adları herhangi bir kabı önerir. İşlev parametresi adı herhangi bir haritayı önerir. Yazılı olarak, aslında C++ taksonomisinde alanın poliferik bir grup olduğu anlamına gelen herhangi bir Sekans veya Birleştirici Konteyner üzerinde çalışacağını düşünüyorum. –

1

Bunun için doğru yol, std :: advance kullanmaktır. Ama burada 'harita üzerinde yeniden boyutlandırma' kullanımına izin veren eğlenceli (yavaş) bir yol var. Daha genel olarak, bu tür bir hile, harita üzerinde değil, vektör üzerinde çalışan diğer şeyler için kullanılabilir.

map<K,V> m; //your map 
vector< pair<K,V> > v(m.begin(), m.end()); 
v.resize(n); 
m = map<K,V>(v.begin(),v.end());