2013-09-21 11 views
6

jest tam, w C++ "Standard Library", dowolna "Asocjacyjna" (tj. "Key-Value") Container/Data Structure, która ma możliwość, aby zachować porządek, według kolejności wstawiania?C + 11 Skojarzony pojemnik, który zachowuje pozycję reklamową?

Widziałem kilka tematów na ten temat, jednak wydaje się, że większość przed C++ 11.

Niektórzy sugerują użycie "boost :: multi_index", ale jeśli w ogóle to możliwe, wolałbym "używać" standardowych kontenerów/struktur.

Widzę, że C++ 11 ma kilka, najwyraźniej, "nieuporządkowanych" pojemników asocjacyjnych: link.

Czy którekolwiek z nich są w jakiś sposób "konfigurowalne", tak że są sortowane tylko według zamówienia reklamowego?

Dzięki!

C

+2

Po prostu użyj nieuporządkowanej_mapy i wektora razem – aaronman

+1

Szukasz 'std :: vector >'? –

+0

Więc chcesz ekwiwalent Java * LinkedHashMap *? – hyde

Odpowiedz

1

nr

Jesteś mieszanie liniowy dostęp z losowo. Niezbyt dobrzy członkowie łóżka.

Po prostu użyj zarówno vector/list (tj. Kolejność wstawiania), jak i mapy z indeksem do pierwszej.

+2

Są bardzo dobrymi małżonkami, bardzo miło mieć czas, kiedy tego potrzebują, a posiadanie takiego pojemnika również jest trywialne. Jeśli C++ go nie ma, jestem nieco zaskoczony. Przykład: http://docs.oracle.com/javase/7/docs/api/java/util/LinkedHashMap.html – hyde

+0

@hyde - Po prostu łączy dwie struktury danych razem. Dwa - nie jeden. –

+0

Hashmap już jest kombinacją kilku struktur danych wewnętrznie, więc nie widzę różnicy, która sprawia, że ​​... Zamawiany zamówiony hasmap wciąż potrzebuje sporo kodu, powinien być zawinięty wewnątrz jednej klasy i musi oczywiście zapewnić dokładnie taki sam interfejs jako normalną nieuporządkowaną szynę. Należy pamiętać, że zachowanie kolejności wstawiania nie wpływa na efektywność algorytmiczną, w przeciwieństwie do utrzymywania uporządkowanej kolejności. – hyde

0

Nie; taka zdolność została najwyraźniej poświęcona w imię wykonania.

Kolejność równoważnych elementów musi być zachowana dla operacji, w tym rehashów, ale nie ma możliwości określenia oryginalnej kolejności. Teoretycznie można użyć wartości std::rotate lub podobnej do permutowania obiektów w żądanej kolejności po każdym wstawieniu. Jest to oczywiście niepraktyczne, ale dowodzi, że brak zdolności jest nieco arbitralny.

Najlepiej jest zachować podciągi w wewnętrznych pojemnikach. Możesz użyć adaptera iteratora do iteracji nad takim "głębokim" kontenerem, jak gdyby był to pojedyncza sekwencja. Takie narzędzie można prawdopodobnie znaleźć w Boost.

0

Nie. W mapach nieuporządkowanych również nie są przechowywane zgodnie z kolejnością wstawiania.

Możesz użyć wektor, aby zachować ścieżkę klucz!