c++:从元素指针中减去迭代器以获得有效索引是否有效?

标签 c++ iterator abseil

我遇到了以下代码:

for (int i = 0; i < subspan.size(); i++) {
  ...
  int size = size_table[&(subspan[i]) - fullspan.begin()];
  ...
}

subspanfullspan都是std::span类型(实际上是来自Google's Abseil libraryabsl::Span) ,但它们似乎与 std::span 几乎相同),并且是同一数据数组的 View (fullspan 跨越整个数组)。

这是有效且定义良好的代码吗?当 - 运算符与 lhs 指针一起应用时,它似乎依赖于将迭代器转换为相应的指针值。

最佳答案

Is it valid to subtract an iterator from an element pointer to get a valid index?

可能是这样,具体取决于迭代器的定义方式。例如,如果迭代器是相同类型的指针,并且指向相同数组的元素,则它可以工作。

但是,没有通用迭代器概念指定此类操作,因此不能保证此类操作适用于任何标准迭代器。因此,它不能在通用代码中工作,这不是一个可移植的假设。

Is this valid and well defined code?

所讨论的迭代器类型被定义为指针类型,因此满足条件。 Abseil 既没有完整的文档记录也没有详细说明,因此很难说这是有意的功能还是偶然的实现细节。如果是后者,那么代码可能会在 Abseil 的 future 版本中崩溃。

关于c++:从元素指针中减去迭代器以获得有效索引是否有效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70081152/

相关文章:

c++ - 返回多态类

c++ - cocos2d-x 不理解图像/屏幕/比例,opengl windows 模拟器和真实设备之间的相对大小

java - 迭代器 hasNext 返回 true 但 next 抛出异常

c++ - 使用映射迭代器编译错误

ios - 安装了未指定的 Cocoapod 库

c++ - 包含 Bazel header 时如何允许角 "<>"括号?

c++ - 在库中使用 CMake 进行绳降

c++ - SDL iOS 禁用事件泵

java - 两个线程访问频繁更新的 Arraylist 的问题

c++ - 默认模板参数语法