c++ - 减 1 与递减迭代器

标签 c++ pointers iterator undefined-behavior pointer-arithmetic

the accepted answer to "Iterator to last element of std::vector using end()--" @barry 说:

Note that if vector::iterator is just T* (which would be valid), the first form above is ill-formed. The second two work regardless, so are preferable.


引用他的代码:
std::vector<int>::iterator it = --container.end();
std::vector<int>::iterator it = container.end() - 1;
std::vector<int>::iterator it = std::prev(container.end());
该意见在评论中存在争议,但没有明确的解决方案。所以这就是我的问题:第一个和第二个之间的语义差异到底是什么?对于除 vector 以外的结构的迭代器,答案是否会有所不同? ?

最佳答案

对于任何标准库容器,成员函数 end()返回一个 r 值。在将其分配给变量之前,它是“临时的”。
递减运算符 --不需要处理 r 值迭代器。您将修改临时文件,C++ 历史上已采取措施避免这种情况。
因此,--container.end() 可能会编译 在符合标准的 C++ 编译器上。但它可能不会。std::prev(container.end())将在 上工作每符合标准的编译器。

审核:

  • --container.end()可能无法编译。这取决于实现。
  • container.end() - 1仅当容器使用随机访问迭代器时才会编译。
  • std::prev(container.end())将始终编译。

  • 如果它们编译,所有三种形式都将产生相同的结果。

    关于c++ - 减 1 与递减迭代器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69443156/

    相关文章:

    c++ - 我怎样才能忽略 Xcode 中的一些错误?

    c - 按字典顺序对整数数组进行排序

    c++ - 当设置为 begin 时,vector<int>::iterator 从 vector 的末尾开始

    c++ - 迭代器使用的编译时间验证?

    c++ - 在 C++ 中使用带 vector 的对象有更好或更正确的方法吗?

    c++ - 指针迭代器的取消引用适配器

    c++ - GCC 的 "vstring"是什么?

    c++ - 在 Visual Studio 2008 C++ 的 header 中自动指定 .LIB

    c++ - 容器前的 a++ 与将索引移动 1 相同吗?

    c++ - 如何将数据写入进程/内存?