我std::reverse_iterator今天正在与之合作,并且正在考虑如何使用通过调用begin容器创建的值.根据cppreference,如果我reverse_iterator r构造了iterator i,以下必须持有&*r == &*(i-1).
但是,这意味着如果我写这个
std::vector<int> vec = {1, 2, 3, 4, 5};
auto iter = std::make_reverse_iterator(begin(vec));
Run Code Online (Sandbox Code Playgroud)
iter现在指向之前放置的内存begin(vec),这是一个超出界限的内存.通过严格解释C++标准,这将调用UB.
(指针/迭代器有一个特定的规定,指向数组的1-last-the-end-end,但据我所知,没有指针/迭代器到数组1的数字开头.)
所以,我读错了链接,或者在这个案例的标准中是否有特定的规定,或者是在使用时reverse_iterator,整个数组被视为反转,因此,指向数组前面的指针实际上是指针过去结束?
是的,你读错了.
反向迭代器不需要存储指向元素开始之前的指针.
为了说明,采用2个元素的数组:
int a[2];
Run Code Online (Sandbox Code Playgroud)
这些是前向迭代器:
a+0 a+1 a+2 // The last one is not dereferenceable
Run Code Online (Sandbox Code Playgroud)
反向迭代器将以相反的顺序用这些完全相同的值表示:
a+2 a+1 a+0 // The last one cannot be dereferenced
Run Code Online (Sandbox Code Playgroud)
因此,虽然解除引用正常的迭代器非常简单,但反向迭代器解除引用稍微复杂一些:( pointer[-1]对于随机访问迭代器,其他更糟糕的是:)It copy = pointer; --copy; return *copy;.
请注意,使用forward-iterator比反向迭代器更常见,因此前者比后者更有可能为它们优化代码.然而,由于所有转换都是一个不错的优化编译器,但是没有碰到那个角落的通用代码很可能在任何一种类型下运行得更好.
| 归档时间: |
|
| 查看次数: |
126 次 |
| 最近记录: |