`closed_iota` 和 `iota` 之间的区别?
Difference between `closed_iota` and `iota`?
ranges-v3 库中的 closed_iota
和 iota
有什么区别?
第二个遵循标准的 C++ 表达范围的方式——默认为 right-hand 边开范围。第一个是包容性的。
iota
有两个参数:start
和 end
。它产生从 start
到 end
没有 的元素,包括 end
.
closed_iota
有两个参数:start
和 end
。它产生从 start
到 end
包括 end
值的元素。
示例:iota(1, 5)
表示由{1, 2, 3, 4}
组成的范围,closed_iota(1, 5)
表示由{1, 2, 3, 4, 5}
.
组成的范围
你需要两者,因为默认情况下,我们希望事情是 right-hand 边排他性的,但有时你想要 整个值范围 .在这种情况下,您需要 closed_iota
.
但是存在不一致之处 - 请查看 std::uniform_xxx_distribution
s。
closed_iota
和 iota
都采用 2 个参数,一个 begin
值和一个 end
值,并生成一系列值,其中包含 begin
和 end
.
前者生成begin
到end
包括的所有值,后者也是一样,只是最后一个值,即[=14] =], 被排除在外。
您可能想知道 closed_iota
的意义何在,因为您始终可以进行此转换:
// from this
closed_iota(begin, end);
// to this
iota(begin, end + 1);
一个原因是这种转换并非总是可能的。例如考虑当 end
是最大可能的 int
时会发生什么。然后第二个版本将在执行 end + 1
时调用 UB。您可以使用 closed_iota
.
解决此特殊情况
ranges-v3 库中的 closed_iota
和 iota
有什么区别?
第二个遵循标准的 C++ 表达范围的方式——默认为 right-hand 边开范围。第一个是包容性的。
iota
有两个参数:start
和 end
。它产生从 start
到 end
没有 的元素,包括 end
.
closed_iota
有两个参数:start
和 end
。它产生从 start
到 end
包括 end
值的元素。
示例:iota(1, 5)
表示由{1, 2, 3, 4}
组成的范围,closed_iota(1, 5)
表示由{1, 2, 3, 4, 5}
.
你需要两者,因为默认情况下,我们希望事情是 right-hand 边排他性的,但有时你想要 整个值范围 .在这种情况下,您需要 closed_iota
.
但是存在不一致之处 - 请查看 std::uniform_xxx_distribution
s。
closed_iota
和 iota
都采用 2 个参数,一个 begin
值和一个 end
值,并生成一系列值,其中包含 begin
和 end
.
前者生成begin
到end
包括的所有值,后者也是一样,只是最后一个值,即[=14] =], 被排除在外。
您可能想知道 closed_iota
的意义何在,因为您始终可以进行此转换:
// from this
closed_iota(begin, end);
// to this
iota(begin, end + 1);
一个原因是这种转换并非总是可能的。例如考虑当 end
是最大可能的 int
时会发生什么。然后第二个版本将在执行 end + 1
时调用 UB。您可以使用 closed_iota
.