2010-08-05 20 views
7

Mam std::list< std::pair<std::string,double> >, które wiem, że jest posortowane zgodnie z std::string element.Jak przekonwertować posortowane std :: lista std :: pair na std :: map

Ponieważ chciałbym zrobić wiele std::find_if opartą na elemencie std::string, wierzę std::map<string,double,MyOwnBinaryPredicate> z lower_bound i upper_bound byłoby bardziej odpowiednie.

Faktem jest, że chcę insert elementów w std::map w skuteczny sposób. Dlatego chcę użyć dodatkowego iteratora, aby przyspieszyć działanie insert.

Wierzę, najprostszym sposobem byłoby użyć const_reverse_iterator przejść przez std::list i używać begin() z std::map.

Czy zrobiłbyś to w ten sposób, czy to zły pomysł?

Dzięki!

+0

nie umieścić [C++] w tytule. Po to są tagi. – NullUserException

+0

Z odpowiedziami udzielonymi przez grddev i Luthera Blissetta, mam podobne wyniki jak przy mojej pierwszej sugestii (używając 'begin()', a nie 'end()'). Jednak oba są zwięzłe. Akceptuję odpowiedź grddev za jej prostotę, ale pamiętam o 'std :: inserter'. Dziękuję wam wszystkim! – Wok

Odpowiedz

11

Jeśli masz już posortowaną listę, która jest posortowana według orzecznika Predicate, wystarczy wykonać następujące czynności:

std::list< std::pair<std::string, double> > sorted_list; 
std::map<string, double, Predicate> map(sorted_list.begin(), sorted_list.end()); 

Konstruktor map ma liniową złożoność czas, jeśli lista jest już posortowane, O (n * log n) w przeciwnym razie. Następnie możesz pracować bezpośrednio z mapą, tak jak każdą inną.

Jeśli chcesz później wyniki z powrotem na liście można po prostu zrobić coś przeciwnego:

sorted_list.assign(map.begin(), map.end());
+3

+1: Zapomniałem o sortowaniu liniowym. Wspaniały! –

+0

Zaletą tej odpowiedzi jest jej prostota. Dziękuję Ci! – Wok

4

można użyć std :: kopię i std :: wprowadzające:

std::copy(the_list.begin(),the_list.end(),std::inserter(the_map,the_map.begin())); 

ponieważ iterator dla pary lista <> ma typ wartości zgodnego mapowania < x, y> 's iteratory.

+0

std :: inserter()? cóż, uczysz się czegoś nowego codziennie :) –

+1

+1: To ma równie dobrą wydajność, a także działa z istniejącą mapą – grddev

+0

Używa 'std :: inserter (the_map, the_map.begin())' lub 'std :: inserter (the_map , the_map.end()) "lepiej tutaj, biorąc pod uwagę, że lista jest sortowana? – msandiford

0

Chciałbym po prostu powtórzyć listę i wstawić każdą parę do mapy lub użyć starannej metody opisanej przez Luthera Blissetta.
Fakt, że nie otrzymuję tego, co próbujesz zrobić, oznacza, że ​​spowoduje to nieczytelny kod lub że jesteś daleko.
Dlaczego robisz to w ten sposób?
Czy możesz zmienić kod, aby zamiast niego wyświetlić mapę zamiast na początku?

+0

Muszę użyć std :: list w pierwszej kolejności, ponieważ istnieją elementy, które mają ten sam klucz std :: string. Następnie są operacje, które pozwalają mi użyć std :: map na końcu. Mogę rozważyć użycie std :: map nieco wcześniej w procesie, ale pytanie jest w tym przypadku nadal aktualne. – Wok

+0

czy rozważałeś użycie std :: multimap? Zobacz tutaj: http://www.sgi.com/tech/stl/Multimap.html –

Powiązane problemy