减去 1 与递减迭代器
Subtracting 1 vs decrementing an iterator
在 @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()
returns 一个右值。在将其分配给变量之前,它是“临时的”。
递减运算符 --
不需要在右值迭代器上工作。您将修改一个临时文件,C++ 历来已采取措施避免这种情况。
因此,--container.end()
可能会在符合标准的 C++ 编译器上编译。但它可能不会。
std::prev(container.end())
将在 每个 符合标准的编译器上工作。
评论:
--container.end()
可能无法编译。这取决于实施。
container.end() - 1
仅当容器使用随机访问迭代器时才会编译。
std::prev(container.end())
将始终编译。
如果编译,所有三种形式将产生相同的结果。
在
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()
returns 一个右值。在将其分配给变量之前,它是“临时的”。
递减运算符 --
不需要在右值迭代器上工作。您将修改一个临时文件,C++ 历来已采取措施避免这种情况。
因此,--container.end()
可能会在符合标准的 C++ 编译器上编译。但它可能不会。
std::prev(container.end())
将在 每个 符合标准的编译器上工作。
评论:
--container.end()
可能无法编译。这取决于实施。container.end() - 1
仅当容器使用随机访问迭代器时才会编译。std::prev(container.end())
将始终编译。
如果编译,所有三种形式将产生相同的结果。