c++ - 为什么我不能递增 std::unordered_map 迭代器?

标签 c++ iterator constants increment unordered-map

std::unordered_map<int, int> _cache;

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

这行得通

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

但这不是

std::rotate(_cache.begin(), _cache.begin() + 1, _cache.end());//错误发生在 _cache.begin() + 1 说“错误类型”

这对我来说真的没有意义,因为它们都是迭代器,除了一个用于 vector 和一个用于 unordered_map

然后我也试了这个 std::rotate(_cache.begin(), _cache.begin()++, _cache.end());

但是我得到了以下错误: _Left:您不能分配给 const 变量 _Right:你不能分配给 const 变量

最佳答案

unordered_map 迭代器是前向迭代器。这意味着它们一次只能移动一步,只能向前移动,从一个位置到另一个位置需要遍历所有中间位置。因此,前向迭代器不支持 operator+,因为它是一个 O(n) 操作。标准库的作者认为,当人们看到 a + b 时,他们期望它是 O(1),因此如果迭代器类型不能满足该要求,那么运算符不应该得到支持。

vector 迭代器是随机访问的,这意味着它们确实支持 operator+,因为它可以实现为 O(1)。您可以这样做:

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

除此之外也不起作用,因为 std::rotate 是一个修改操作。并且您不能修改 unordered_map 中元素的键。

关于c++ - 为什么我不能递增 std::unordered_map 迭代器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37904441/

相关文章:

C++ const char* 到 char*

c++ - 如何使代码中的 "position:"更精确?

c++ - Windows 消息异常

c++ - STL ostream_iterator 写入屏幕,即使我覆盖了它?

c++ - 干掉只有 const 不同的代码

c - 尝试为常量分配新值

c++ - 反对 Json 并返回

c++ - 从 int 映射到类型说明符

java - 返回迭代器而不是集合

Java - 迭代器 : "Syntax error, parameterized types are only available if source level is 5.0"