c++ - 减 1 与递减迭代器
问题描述
在“使用 end() 迭代到 std::vector 的最后一个元素”的公认答案中, @barry 指出:
请注意,如果 vector::iterator 只是 T* (这将是有效的),则上面的第一种形式是格式错误的。后两个工作无论如何,所以是可取的。
参考他的代码:
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())
将始终编译。
如果它们编译,所有三种形式都将产生相同的结果。
推荐阅读
- javascript - 部分视图无法识别包含在父级中的 Javascript 文件
- c# - 是否可以将多维数组存储到对象中?
- python - 从 Pandas 中的字符串切片创建列
- python - 利用 re.search 的 Python 程序需要在两个关键字之间定位字符串但不起作用?
- reactjs - ReferenceError:类型未定义
- github - 在 vscode 中恢复意外删除的 github auth 图标
- docker - 如何将 Github 连接到谷歌云平台?
- python - matlpotlib 中的标准化颜色映射到底发生了什么?
- javascript - 如何在下面的代码中摆脱 RequestOptionsArgs
- python - 使用外部数据库操作时,Django RestFramework 中需要序列化程序