2016-06-19 15 views
1
std::unordered_map<int, int> _cache; 

std::vector<std::unordered_map<int, int>::iterator> _lruList; 

das funktioniertWarum kann ich den Iterator std :: unordered_map nicht erhöhen?

std::rotate(_lruList.begin(), _lruList.begin() + 1, _lruList.end());

aber nicht

std::rotate(_cache.begin(), _cache.begin() + 1, _cache.end()); // error occurs on _cache.begin() + 1 saying "error type"

die nicht wirklich Sinn für mich, weil sie beide Iteratoren sind mit einer Ausnahme für einen vector ist und man ist für eine unordered_map

Dann bin ich ein lso versucht, diese std::rotate(_cache.begin(), _cache.begin() ++, _cache.end());

aber ich habe die folgenden Fehler: _Left: you can't assign to a variable that is const _Right: you can't assign to a variable that is const

Antwort

3

unordered_map Iteratoren vorwärts Iteratoren sind. Das heißt, sie können sich nur einen Schritt nach dem anderen bewegen, nur vorwärts, und um von einer Position zur nächsten zu gelangen, müssen alle dazwischen liegenden Positionen durchlaufen werden. Daher unterstützen Vorwärtsiteratoren operator+ nicht, da dies eine O (n) -Operation wäre. Die Autoren der Standardbibliothek haben das Gefühl, dass wenn Leute a + b sehen, sie erwarten, dass es O (1) ist, und wenn ein Iteratortyp diese Anforderung nicht erfüllen kann, sollte der Operator nicht unterstützt werden.

vector Iteratoren sind Random Access, was bedeutet, dass sie operator+ unterstützen, weil sie als O (1) implementiert werden können. Sie können dies stattdessen tun:

std::rotate(_cache.begin(), std::next(_cache.begin()), _cache.end()); 

Abgesehen davon, dass auch nicht funktionieren, weil std::rotate ein modifizierende Betrieb ist. Und Sie können die Schlüssel der Elemente in unordered_map nicht ändern.

+0

Ich sehe. Danke für die ausführliche Erklärung! – ygongdev