【问题标题】:std::unordered_set::equal_range iterator questionstd::unordered_set::equal_range 迭代器问题
【发布时间】:2019-04-17 04:11:17
【问题描述】:

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 的“隐藏”信息,或者这是对存储桶接口的不太微妙的强制执行(其中限制我们的实施选项)?

我希望这确实是一个保证,鉴于 LegacyForwardIterator 的要求,我只是要求确认(或者更好的消息,包括某种逃生舱口)

【问题讨论】:

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


    【解决方案1】:

    unordered_set 的迭代器是一个正向迭代器(现在命名为LegacyForwardIterator)。

    C++14 标准(最终草案 n4140)对前向迭代器进行了说明:

    24.2.5 前向迭代器 [forward.iterators]

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

    3 两个 dereferenceable 迭代器 ab X 类型在以下情况下提供多遍保证:

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

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

    【讨论】:

    • @P,W。这也是我读到的。太糟糕了。我希望有人能指出漏洞或其他东西,但多次通过保证是标准中非常简单的领域之一。接受这个作为答案(这意味着承认失败,因为我的图书馆尽可能地符合我所希望的标准,但是 c'est la vie)。
    猜你喜欢
    • 1970-01-01
    • 2017-11-27
    • 2020-11-23
    • 1970-01-01
    • 2017-09-09
    • 1970-01-01
    • 2013-09-13
    • 1970-01-01
    相关资源
    最近更新 更多