2017-10-09 25 views
27

Oto mój kod:Decrement od końca std :: map

#include <iostream> 
#include <map> 
using namespace std; 

int main() { 
    map<int , int > myMap; 

    map<int , int>::iterator it; 

    myMap.insert(pair<int , int>(1,2)); 
    myMap.insert(pair<int , int>(671,223)); 
    myMap.insert(pair<int , int>(353,245352)); 

    it = myMap.end() - 1; 

    cout << it->first << it->second << endl; 

    return 0; 
} 

Kompilacja ten kod generuje następujący błąd kompilacji:

error: no match for ‘operator-’ (operand types are ‘std::map<int, int>::iterator {aka std::_Rb_tree_iterator<std::pair<const int, int> >}’ and ‘int’) 
    it = myMap.end() - 1; 

nie wiem dlaczego ja dostaję ten błąd ponieważ myślę, że operacje arytmetyczne są dozwolone we wszystkich typach iteratorów.

Odpowiedz

41

Nie wszystkie kategorie iteratorów obsługują operacje arytmetyczne, to nieporozumienie. Jeśli celem jest napisanie kodu bardziej ogólne, można użyć std::prev:

it = std::prev(myMap.end()); 

Spodziewa dwukierunkową iterację, który iterator std::map „S. Jeśli chcesz przesunąć iterator więcej niż jeden krok, może on zaakceptować drugi parametr określający, jak daleko przesunąć iterator.

Ponadto, po przekazaniu go do iteratora z dostępem losowym, będzie on równie szybki jak arytmetyka.

+0

error: 'prev' nie jest członkiem 'std', otrzymuję ten błąd. Czy potrzebuję do tego jakiegoś pliku nagłówkowego? –

+1

@BhawandeepSingla - '' – StoryTeller

+0

Zawarłem to, wciąż otrzymuję ten sam błąd. Jakieś inne rzeczy, które muszę dodać? –

17

Polecam przeczytać o różnych iterator categories i dowiedzieć się, jakie operacje są dostępne na nich.

W szczególności Iterator std::map to , który nie ma odjęcia binarnego.

Powiązane problemy