{std :: adjacent_find(last,last)是否未定义?

时间:2018-09-19 01:11:20

标签: c++ algorithm language-lawyer

std::adjacent_find

  

搜索两个连续相同元素的范围[firstlast)。

     

返回值

     

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

如果未找到此类元素,则返回last

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

对cppreference的两种可能的实现都进行以下检查:

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

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

1 个答案:

答案 0 :(得分:3)

不。定义明确。

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

  

返回:第一个迭代器{'a': 42} 使得ii都在i + 1范围内,   符合以下相应条件:[first,last)*i == *(i + 1)退货   pred(*i, *(i + 1)) != false(如果找不到这样的迭代器)。

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

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

  

如果未找到此类元素,则返回last