gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 12:17:51 29 4
gpt4 key购买 nike

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/

    29 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com