`closed_iota` 和 `iota` 之间的区别?

Difference between `closed_iota` and `iota`?

ranges-v3 库中的 closed_iotaiota 有什么区别?

第二个遵循标准的 C++ 表达范围的方式——默认为 right-hand 边开范围。第一个是包容性的。

iota 有两个参数:startend。它产生从 startend 没有 的元素,包括 end.

closed_iota 有两个参数:startend。它产生从 startend 包括 end 值的元素。

示例:iota(1, 5)表示由{1, 2, 3, 4}组成的范围,closed_iota(1, 5)表示由{1, 2, 3, 4, 5}.

组成的范围

你需要两者,因为默认情况下,我们希望事情是 right-hand 边排他性的,但有时你想要 整个值范围 .在这种情况下,您需要 closed_iota.

但是存在不一致之处 - 请查看 std::uniform_xxx_distributions。

closed_iotaiota 都采用 2 个参数,一个 begin 值和一个 end 值,并生成一系列值,其中包含 beginend.

前者生成beginend包括的所有值,后者也是一样,只是最后一个值,即[=14] =], 被排除在外。

您可能想知道 closed_iota 的意义何在,因为您始终可以进行此转换:

// from this
closed_iota(begin, end);
// to this
iota(begin, end + 1);

一个原因是这种转换并非总是可能的。例如考虑当 end 是最大可能的 int 时会发生什么。然后第二个版本将在执行 end + 1 时调用 UB。您可以使用 closed_iota.

解决此特殊情况