C++标准是否保证有关在空容器上运行的算法的任何内容?
例如,
#include <algorithm>
#include <iostream>
#include <numeric>
#include <vector>
int main() {
std::vector<int> empty{};
std::reverse(empty.begin(), empty.end());
std::cout << "Sum: " << std::accumulate(empty.cbegin(), empty.cend(), 0) << std::endl;
std::cout << empty.size();
}
按照我的预期构建和运行:
sum: 0
size: 0
我能保证这种行为会发生在任何符合标准的编译器上吗?
回答
由于标准库算法在迭代器范围上运行,因此可以保证算法在传递给它们的任何有效迭代器范围上都是安全有效的。现在我们只需要关心有效的迭代器范围代表什么。
对形成迭代器范围的迭代器的要求:
- 它们必须引用同一个容器的元素(或最后一个元素之后的元素)
- 可以
end通过重复递增来达到begin。换句话说,end不能在begin.
满足这些要求后,我们可以将任何有效范围视为左包含范围:[begin, end)。那么范围具有以下属性:
- 如果
being等于end,则范围为空 - 如果
begin不等于end,则范围内至少有一个元素,并being引用第一个元素 - 所以,我们可以增加
begin一些次数直到begin == end(当发生这种情况时,范围仍然有效)
正是这些属性为迭代器的方便使用提供了支持。该<algorithms>内部基于这些特性,以及。
我们必须意识到编译器无法加强这些要求,我们需要确保传递范围的有效性(有时需要考虑很多因素)。
所以,是的,begin == end当传递给算法时,它仍然是一个有效范围,所以我们得到的输出也是预期有效的。