2012-01-24 20 views
6

próbuję wymazać ostatni element w MultiSet używając:multiset wymazać ostatni element

minheap.erase(minheap.rbegin());

To nie kompiluje i daje 4-5 erros.

Należy zauważyć, że w wielosetach C++, .end() punktów obok ostatniego elementu, a nie do ostatniego elementu.

Wszelkie pomysły?

EDIT:

Dlaczego to dostarczanie różnych liczb?

multiset <int>::reverse_iterator it1 = minheap.rbegin(); 
m1=*(++it1); 

multiset <int>::iterator it2 = minheap.end(); 
m2=*(--it2); 
Z niektórych danych dodawanych w MultiSet `1 'm1 i m2 jest` 2`. Dlaczego nie są tacy sami?
+0

Odnośnie twojej edycji: nie potrzebujesz '++ it1',' rbegin' wskazuje już na ostatni element. –

+0

Och, masz rację, przepraszam, robi się za późno dla mnie: D – Cristy

Odpowiedz

14

Funkcja usuwania musi przyjmować zwykły iterator jako argument. Aby uzyskać taki iterator, można spróbować nazywając

minheap.erase(std::prev(minheap.end())); 

Wymaga to end(), aby uzyskać iterator do końca, po czym wycofuje ją o jeden krok za pomocą nowej funkcji C++ 11 poprz. Jeśli nie masz C++ 11 wsparcie, można alternatywnie napisać

minheap.erase(--minheap.end()); 

Alternatywnie, ponieważ wydaje się, że starasz się używać multimap jako min sterty, czy za lub zamiast korzystania priority_queue algorytmy sterty, takie jak push_heap i pop_heap?

EDIT: Aby odpowiedzieć na kolejne pytanie, dlatego, że dostajesz dwie różne wartości jest to, że logicznie, rbegin wskazuje na ostatni element multimapy, a nie jeden krok przed nim, a punktami końcowymi jeden za końcem. Tworzenie kopii zapasowej o jeden krok oznacza, że ​​odnosi się do tego samego elementu, co rbegin, więc jeśli przesuniesz rbegin o jeden krok w przód, kończy się wskazaniem elementu o jeden krok przed ostatnim elementem.

Mam nadzieję, że to pomoże!

+0

Współcześni ludzie mogą napisać 'std :: prev (minheap.end())', przypuszczam ... –

+0

@ KerrekSB- Whoa! To jest naprawdę fajne! Muszę zacząć czytać zmiany w C++ 11. :-) – templatetypedef

+0

Zobacz moją aktualizację proszę: D. A także, czy nie "--minheap.end()" również zmienia wartość przechowywaną w minheap.end() (zmniejszając ją)? – Cristy