【问题标题】:Confusion over InputIterator semantics/concept requirements对 InputIterator 语义/概念要求的困惑
【发布时间】:2013-09-09 12:23:17
【问题描述】:

C++ InputIterator 是迭代器概念中最有限的类型之一。只保证支持解引用、相等比较、前自增和后自增(以及后自增和解引用)

因为InputIterator 对象经常迭代任意流,您甚至无法确定对相同输入进行两次迭代会产生相同的值。

不过,我很困惑,如果取消引用运算符 operator * 在您每次取消引用时都保证返回相同的值,前提是您从不增加迭代器。

例如,假设std::begin(some_input_stream)返回一个满足InputIterator概念要求的对象,而it不等于或超过结束位置:

auto it = std::begin(some_input_stream);
auto value1 = *it;
auto value2 = *it;
assert(value1 == value2);

value1 是否保证与value2 的值相同? (当然,前提是 *it 产生的任何类型都实现了合理的相等比较语义)

【问题讨论】:

    标签: c++ c++11 iterator


    【解决方案1】:

    value1 是否保证与value2 的值相同?

    是的。事实上,您也可以复制迭代器,并且该副本保证会给出相同的结果直到您增加其中一个迭代器:

    auto it2 = it;
    auto value3 = *it2;
    assert(value3 == value1);
    
    ++it2;
    auto value4 = *it; // ERROR: might not be dereferencable any more
    

    这是由 C++11 表 107 中*a 的要求指定的(输入迭代器要求):

    如果a == b(a,b)== 的域中,则*a 等价于*b

    ++r之后:

    r 的先前值的任何副本不再需要可取消引用或位于 == 的域中。

    【讨论】:

    • 事实上,最后一个引号非常重要,因为 " 如果取消引用运算符 operator * 保证每次取消引用它时返回相同的值,只要你从不增加迭代器。” 仅在您不增加迭代器的任何可能副本时才成立。
    【解决方案2】:

    我相信它必须有效。对InputIterator 的要求有效地强制实现缓存最后读取的值,然后由operator* 返回。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-06-28
      • 2011-06-29
      • 1970-01-01
      • 1970-01-01
      • 2021-08-28
      • 1970-01-01
      • 1970-01-01
      • 2018-10-05
      相关资源
      最近更新 更多