我应该在使用 std::transform 之前检查向量是否为空
Should I check if a vector is empty before I use std::transform
在使用 std::transform
和 back_inserter
之前检查向量是否为空是否是个好主意,或者不会发生任何错误,因为 vector.begin()
与vector.end()
并且不会在新向量中插入任何内容?
这是不需要的。如果 empty()
是 true
,那么 begin() == end()
和 transform
将成为非操作,因为它在 [begin, end)
范围内工作
所有 std
算法都是空容器上的 noops。唯一有问题的是像 std::minmax(std::initializer_list)
这样的东西,它要求它是非空的;它不是 return 迭代器,而是元素。
(请注意,在这种情况下,它需要一个列表,通常就在 {}
中,因此如果它为空通常很明显。)
你在调用它们之前测试是否为空的唯一原因应该是:
您即将对数据连续执行许多此类算法。
您希望能够通过断言或断点或日志轻松检测传递给空容器的情况。
除了“什么都不做”之外,您处理空数据的方式有些不同(注意:这通常但并非总是表明您的设计存在缺陷)。
在使用 std::transform
和 back_inserter
之前检查向量是否为空是否是个好主意,或者不会发生任何错误,因为 vector.begin()
与vector.end()
并且不会在新向量中插入任何内容?
这是不需要的。如果 empty()
是 true
,那么 begin() == end()
和 transform
将成为非操作,因为它在 [begin, end)
所有 std
算法都是空容器上的 noops。唯一有问题的是像 std::minmax(std::initializer_list)
这样的东西,它要求它是非空的;它不是 return 迭代器,而是元素。
(请注意,在这种情况下,它需要一个列表,通常就在 {}
中,因此如果它为空通常很明显。)
你在调用它们之前测试是否为空的唯一原因应该是:
您即将对数据连续执行许多此类算法。
您希望能够通过断言或断点或日志轻松检测传递给空容器的情况。
除了“什么都不做”之外,您处理空数据的方式有些不同(注意:这通常但并非总是表明您的设计存在缺陷)。