【问题标题】:Is std::adjacent_find(last, last) undefined?std::adjacent_find(last, last) 未定义吗?
【发布时间】:2018-09-19 01:11:19
【问题描述】:

std::adjacent_find

在范围 [first, last) 中搜索两个连续的相同元素。

返回值

第一对相同元素中的第一个的迭代器,即第一个迭代器it,使得*it == *(it+1) 用于第一个版本或p(*it, *(it + 1)) != false 用于第二个版本。

如果没有找到这样的元素,则返回last

但是,尚不清楚它应该如何处理范围 {last, last}。

cppreference 上的两种可能实现都有以下检查:

if (first == last) {
    return last;
}

std::adjacent_find(last, last) UB 还是标准定义的?

【问题讨论】:

    标签: c++ algorithm language-lawyer


    【解决方案1】:

    没有。定义明确。

    引用 C++ 标准草案 N4296,第 25.2.8/1 节:

    返回:第一个迭代器 i 使得 ii + 1 都在 [first,last) 范围内 下列相应条件成立:*i == *(i + 1)pred(*i, *(i + 1)) != false返回 last 如果没有找到这样的迭代器。

    因此,如果first == last,则表示搜索范围为空,因此该方法应返回last

    对 CppReference 的检查非常正确。也是mentioned on CppReference

    如果没有找到这样的元素,则返回last

    【讨论】:

    • cppreference 遗漏了这个重要部分“使得ii + 1 都在[first,last) 范围内”,所以它是不完整的。
    • @DevNull 在范围内搜索两个连续的元素我觉得已经够清楚了。
    • @DevNull 你知道[last, last)是一个空范围,没有什么可搜索的,所以last可以直接返回,不是吗?
    • 您引用的标准中的措辞(谢谢!)更加明确。我知道“[first,last)”是什么意思,但是,关于 cppreference 的文章并没有完全清楚地表明 last 不会受到尊重。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-16
    • 1970-01-01
    • 1970-01-01
    • 2020-09-21
    • 2014-08-21
    相关资源
    最近更新 更多