代码之家  ›  专栏  ›  技术社区  ›  Emile Cormier

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

  •  4
  • Emile Cormier  · 技术社区  · 15 年前

    考虑以下事项:

    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 回复  |  直到 15 年前
        1
  •  9
  •   AnT stands with Russia    15 年前

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

    本标准规定 空迭代器范围 在24.1/7版本中,没有任何地方提到向 std::fill 算法导致未定义的行为。

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

        2
  •  1
  •   JonM    15 年前

    虽然我不认为在标准中特别禁止它,但我会说不。标准要求迭代器范围的类型为 [first, last) 其中包括 first 包括但不包括 last . 传递相同的值 第一 最后的 这个定义没有逻辑意义,因为它既包括也不包括,所以我希望得到未定义的行为。

    编辑: 清理了我的初始响应,并添加了以下内容:在刷完我的 mathematical interval notation ,我发现了 [x,x) 定义为空集。所以我上面的回答是错误的——我不会期望得到未定义的行为。