std :: unordered_set :: equal_range迭代器问题

时间:2019-04-17 04:11:17

标签: c++ c++11 iterator c++14 language-lawyer

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 的要求,我希望这确实是一项保证,我只是在要求确认(或更好的消息,包括某种逃生舱口盖)

1 个答案:

答案 0 :(得分:2)

unordered_set的迭代器是正向迭代器(现名为LegacyForwardIterator)。

C ++ 14标准(最终草案n4140)对此进行了规定,涉及转发迭代器:

  

24.2.5转发迭代器[forward.iterators]

     

1如果满足
,则类或指针类型X满足前向迭代器的要求   ...
  (1.5)—类型为X的对象提供多次通过保证,如下所述。
  ...

     

3类型为a的两个 可引用 迭代器bX提供多次通过保证:

     

(3.1)- a == b暗示++a == ++b
  (3.2)— X是指针类型,或者表达式(void)++X(a)*a等价于表达式*a

在这种情况下,将(1.5)和(3.1)组合起来将意味着++iteratorFromEqualRange == ++iteratorFromFind;受该标准的保证,前提是这两个迭代器都可以被取消引用。