std::unordered_set::equal_range
返回一对迭代器,这些迭代器描述集合中的值范围,其中值的键比较相等。鉴于:
auto iteratorFromEqualRange = someUnorderedSet.equal_range(key).first;
auto iteratoFromFind = someUnorderedSet.find(key);
标准是否保证:
++iteratorFromEqualRange == ++iteratorFromFind;
它们都是根据std::unordered_set::iterator
来定义的吗?换句话说,std::unordered_set
的另一种实现方式是否可以保留有关我们正在迭代的 context 的“隐藏”信息,或者这不是对Bucket接口的非常微妙的实施(这限制了我们的实施选项)?
鉴于 LegacyForwardIterator 的要求,我希望这确实是一项保证,我只是在要求确认(或更好的消息,包括某种逃生舱口盖)
答案 0 :(得分:2)
unordered_set
的迭代器是正向迭代器(现名为LegacyForwardIterator)。
C ++ 14标准(最终草案n4140)对此进行了规定,涉及转发迭代器:
24.2.5转发迭代器[forward.iterators]
1如果满足
,则类或指针类型X
满足前向迭代器的要求 ...
(1.5)—类型为X
的对象提供多次通过保证,如下所述。
...3类型为
a
的两个 可引用 迭代器b
和X
提供多次通过保证:(3.1)-
a == b
暗示++a == ++b
和
(3.2)—X
是指针类型,或者表达式(void)++X(a)
,*a
等价于表达式*a
。
在这种情况下,将(1.5)和(3.1)组合起来将意味着++iteratorFromEqualRange == ++iteratorFromFind;
受该标准的保证,前提是这两个迭代器都可以被取消引用。