【问题标题】:c++ what's the result of iterator + integer when past-end-iterator?c ++过去结束迭代器时迭代器+整数的结果是什么?
【发布时间】:2011-08-22 06:58:57
【问题描述】:

假设你有一个随机访问迭代器(例如std::vector myVector)

当iter + someInt 是过去的迭代器时, iter + someInt == myVector.end()??

或者它的值是否与myVector.end() 不同?

【问题讨论】:

标签: c++ vector iterator


【解决方案1】:

这是未定义的行为。任何事情都可能发生。仅举几个选项:什么都没有、程序退出、异常、崩溃。

【讨论】:

【解决方案2】:

这是未定义的行为,标准没有说明其结果。

【讨论】:

    【解决方案3】:

    这将根据 C++ 标准 (2003) 调用未定义的行为。

    【讨论】:

    • 什么部分/段落?
    【解决方案4】:

    C++ 标准未定义结果。

    【讨论】:

      【解决方案5】:

      确实,这会导致 c++ 标准之后的未定义行为(请参阅其他答案),有时是 currios,实际会发生什么?

      事实上,这通常一点都不神秘,而且很清楚会发生什么,但它取决于使用的编译器及其版本、标准库和编译器标志以及您的操作系统。 这也意味着,您绝对不应该依赖它(例如,下一个编译器版本可能会改变行为)。

      对于您的问题(您不应依赖以下内容): 在当前的编译器(gcc、msvc、intel c++ 编译器)中,std::vector 通常(至少)有两个成员:

      T* _begin_; // pointing to begin of array of vector
      T* _end_; // pointing to end(), note that array might be larger due to reserve()
      

      所以通常你只会得到一个超出 end 的指针:没有任何意义的事情发生。通常你甚至可以轻松地取消引用它(或者因为数组大于

      _end_-_begin_
      

      或者因为程序可以访问内存之后。当然,内容可能是垃圾)。

      如果您真的感兴趣,请查看汇编代码(有优化和没有优化)。

      【讨论】:

        猜你喜欢
        • 2019-04-19
        • 2013-02-21
        • 1970-01-01
        • 2012-08-16
        • 1970-01-01
        • 2018-07-14
        • 2010-11-06
        • 1970-01-01
        • 2011-01-19
        相关资源
        最近更新 更多