将空范围(相同的迭代器)传递给STL算法会导致定义的行为吗?

时间:2010-02-16 01:41:52

标签: c++ stl iterator

请考虑以下事项:

std::vector<int> vec(1); // vector has one element
std::fill(vec.begin(), vec.begin(), 42);
std::fill(vec.begin()+1, vec.end(), 43);
std::fill(vec.end(), vec.end(), 44);

上述所有std::fill用法是否会导致定义的行为?我保证vec将保持不变吗?我倾向于认为“是”,但我想确保标准允许这样使用。

2 个答案:

答案 0 :(得分:9)

不,如果不会导致未定义的行为。

标准定义了24.1 / 7中的空迭代器范围,并且没有提到向std::fill算法提供空范围会导致未定义的行为。

这实际上是人们对经过深思熟虑的实施所期望的。使用自然处理emtpy范围的算法,强制要求检查调用者的空范围将是一个严重的设计错误。

答案 1 :(得分:1)

虽然我不相信它在标准中被特别禁止,但我会拒绝。该标准要求迭代器范围为[first, last)类型,其中包括first以及所有内容,但不包括last。传递firstlast的相同值对于这个定义没有逻辑意义,因为它既包括也包括在内,所以我希望得到未定义的行为。

编辑: 清理了我的初始响应,并添加了这个:在我的mathematical interval notation上刷完后,我发现[x,x)形式的间隔被定义为空集。所以我的上述答案是错误的 - 我不希望得到未定义的行为。