为啥我不能增加 std::unordered_map 迭代器?

Posted

技术标签:

【中文标题】为啥我不能增加 std::unordered_map 迭代器?【英文标题】:Why can't I increment std::unordered_map iterator?为什么我不能增加 std::unordered_map 迭代器? 【发布时间】:2016-06-19 06:06:34 【问题描述】:
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()); // error occurs on _cache.begin() + 1 saying "error type"

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

然后我也试过这个 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

【问题讨论】:

【参考方案1】:

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中元素的键。

【讨论】:

我明白了。谢谢你这么详细的解释! 为什么允许在前向迭代器上使用++ 而不允许使用+1 @Iamanon 您不能仅基于类型重载基于值的函数。所以你不能允许+1 而不允许+1000。我的回答中解释了不允许的原因。

以上是关于为啥我不能增加 std::unordered_map 迭代器?的主要内容,如果未能解决你的问题,请参考以下文章

为啥意外的无限循环会增加 CPU 使用率?

为啥我在delphi安装了第三方控件却不能用?

为啥我不能在数据框中查看更多行? [复制]

装了SQL Server 2000,为啥我的C盘增加了1G还多

for 循环中,step 步长 有啥作用,为啥要设置 步长

Dev c++程序不能调试为啥?