2013-09-21 6 views
6

c'è, nella "Libreria standard" di C++, qualsiasi contenitore/struttura dati "associativi" (cioè "valore-chiave"), che ha la capacità, di conservare l'ordine, per ordine di inserimento?C + 11 Contenitore associativo che mantiene l'ordine di inserimento?

Ho visto diversi argomenti su questo, tuttavia, sembra, la maggior parte prima di C++ 11.

Alcuni suggeriscono di utilizzare "boost :: multi_index", ma, se possibile, preferirei "usare" contenitori/strutture standard.

Vedo che C++ 11 ha diversi contenitori apparentemente "non ordinati": link.

Alcuni di questi sono, in qualche modo, "configurabili", in modo tale che vengano ordinati solo per ordine di inserimento?

Grazie!

C

+2

Basta usare insieme unordered_map e un vettore – aaronman

+1

Stai cercando 'std :: vector >'? –

+0

Quindi vuoi l'equivalente di * LinkedHashMap * di Java? – hyde

risposta

1

No.

si stia mescolando l'accesso lineare con casuale. Non molto buoni compagni di letto.

Basta usare sia un vector/list (vale a dire l'ordine di inserimento) insieme a una mappa utilizzando un indice nel primo.

+2

Sono ottimi compagni di letto, molto piacevoli da avere quando, ne hanno bisogno, e avere un contenitore simile è anche una banale implementazione. Se il C++ non ne ha uno, sono un po 'sorpreso. Esempio: http://docs.oracle.com/javase/7/docs/api/java/util/LinkedHashMap.html – hyde

+0

@hyde - Collega solo due strutture di dati. Due - non uno. –

+0

Hashmap è già una combinazione di diverse strutture di dati internamente, quindi non vedo quale differenza faccia ... L'hashmap di inserimento ordinato ha ancora bisogno di un bel po 'di codice, dovrebbe essere racchiusa all'interno di una classe e deve ovviamente fornire esattamente la stessa interfaccia come normale hashmap non ordinata. Si noti che mantenere l'ordine di inserimento non influisce sull'efficienza algoritmica, diversamente dall'ordinamento ordinato. – hyde

0

No; tale capacità era apparentemente sacrificata in nome della performance.

L'ordine degli articoli equivalenti è necessario per essere conservato tra le varie operazioni, compresi i rientri, ma non è possibile specificare l'ordine originale. In teoria, potresti usare std::rotate o simili per permutare gli oggetti nell'ordine desiderato dopo ogni inserimento. Ovviamente poco pratico, ma dimostra che la mancanza di capacità è un po 'arbitraria.

La soluzione migliore è mantenere le sottosequenze nei contenitori interni. È possibile utilizzare un adattatore iteratore per iterare su un contenitore "profondo" come se fosse una singola sequenza. Tale utilità può probabilmente essere trovata in Boost.

0

No. Anche nelle mappe non ordinate, non vengono memorizzate in base all'ordine di inserimento.

È possibile utilizzare vettore per mantenere la traccia della chiave !