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

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

std :: unordered_map 반복기를 증가시킬 수없는 이유는 무엇입니까?

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

작동하지만, 이것은하지 않습니다 하나가 vector입니다 제외하고 그들은 모두 반복자이기 때문에 정말 이해가되지 않습니다

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

하나는 unordered_map

다음으로 나는 LSO이 std::rotate(_cache.begin(), _cache.begin() ++, _cache.end());

을 시도했지만 나는 다음과 같은 오류를 가지고 : _Left: you can't assign to a variable that is const _Right: you can't assign to a variable that is const

답변

3

unordered_map 반복자 앞으로 반복자입니다. 즉, 한 번에 한 단계 씩 이동할 수 있고 앞으로 만 움직일 수 있으며 한 위치에서 다른 위치로 이동하려면 모든 중재 포지션을 통과해야합니다. 따라서 앞으로 반복자는 operator+을 지원하지 않습니다. O (n) 연산이기 때문입니다. 표준 라이브러리의 작성자는 사람들이 a + b을 볼 때 O (1)가 될 것으로 예상했기 때문에 반복기 유형이 해당 요구 사항을 충족 할 수 없다면 연산자를 지원하면 안됩니다.

vector 반복자는 임의 액세스이므로을 지원하므로 O (1)로 구현할 수 있습니다. 대신이 작업을 수행 할 수 있습니다 것을 제외하고

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

도 작동하지 않습니다, std::rotate는 수정 작업이기 때문이다. 그리고 unordered_map에서 요소 키를 수정할 수 없습니다.

+0

알 수 있습니다. 자세한 설명을 해주셔서 감사합니다! – ygongdev