【问题标题】:What does the C++ standard says for algorithms when first <= last is not fulfilled?当 first <= last 未满足时,C++ 标准对算法有何规定?
【发布时间】:2016-09-03 18:04:40
【问题描述】:

first &lt;= last 条件不满足时,官方 C++ 标准对算法有何规定,firstlast 是传递给标准算法之一的迭代器?

我看到了三种可能性:

  • 算法需要检查条件,如果它没有满足,算法不会做任何事情
  • 需要算法才能引发异常
  • 这是未定义的行为,所以...任何事情都可能发生

我很困惑,因为在算法描述中我没有看到关于firstlastrequires 子句。

EDIT1:这是对问题的简化。更准确的版本是“当通过连续应用operator++ 无法从first 访问last 时,算法会发生什么?

EDIT2:我问这个问题是因为我正在实现std::reverse 的专门化,我想知道是否应该检查这个条件,或者当last 无法访问时我是否可以允许该函数做一些完全错误的事情来自first

【问题讨论】:

  • 条件不满足时,直接返回false。
  • @PankajKumarThapa 阅读问题...当我执行std::sort(first, last)last 出现在first 之前会发生什么?
  • 您的问题是基于算法需要这种排序的前提,但您最后声明说您没有证据证明这种说法。你到底在问什么?
  • @LightnessRacesinOrbit 我相应地修改了问题

标签: c++ algorithm language-lawyer undefined-behavior c++-standard-library


【解决方案1】:

您要查找的文本位于迭代器部分(重点是我的):

[iterator.requirements.general]/7-8

当且仅当存在有限的 使 i == j 的表达式 ++i。如果 j 可以从 i 到达,则它们指的是同一序列的元素。

大多数在数​​据结构上运行的库算法模板都有使用范围的接口。 范围是一对指定计算开始和结束的迭代器。范围 [i,i) 是 空范围; 一般来说,范围 [i,j) 指的是数据结构中以元素开头的元素 i 指向的元素,直到但不包括 j 指向的元素。范围 [i,j) 有效当且仅当 j 可以从 i 到达。将库中的函数应用于无效范围的结果未定义。

标准在这里明确指出,将无效(未完成)范围传递给标准算法会导致未定义的行为。算法本身确实以[first, last) 格式指定范围。

请注意,/7 不允许交换随机访问迭代器的参数,因为您不能一遍又一遍地应用 ++first 以达到 last

【讨论】:

  • 你去 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-05
  • 1970-01-01
  • 2018-12-10
  • 2012-04-22
相关资源
最近更新 更多