为什么 std::reverse_iterator 比直接迭代器慢?

Why is std::reverse_iterator slower than a direct iterator?

提问人:anton_rh 提问时间:5/14/2022 最后编辑:wohlstadanton_rh 更新时间:5/14/2022 访问量:169

问:

我注意到在取消引用之前总是递减内部迭代器的副本:std::reverse_iterator

_GLIBCXX17_CONSTEXPR reference
operator*() const
{
    _Iterator __tmp = current;
    return *--__tmp;
}

这是GNU标准C++库中的实现。cppreference.com 以同样的方式实现它。

问题:在反向迭代器构造函数中只递减一次,而不是在每个取消引用步骤中递减它不是更有效吗?

C++ C++-标准库 反向迭代器

评论

4赞 François Andrieux 5/14/2022
问题出在反向端迭代器上,即范围的 .你不能减少它,但你必须能够从中构建。begin
0赞 anton_rh 5/16/2022
相关问题

答:

1赞 eerorika 5/14/2022 #1

问题:在反向迭代器构造函数中只递减一次,而不是在每个取消引用步骤中递减它不是更有效吗?

当无法以这种方式实现反向迭代器时,效率就无关紧要了。考虑一个表示 的反向迭代器。为了达到它,你必须递减内部迭代器,使其指向第一个元素之前。这是不可能的,因此必须将递减延迟到间接递减,因为结束迭代器不可取消引用。rend

评论

0赞 anton_rh 5/14/2022
为什么不在开始迭代器之前引入呢?我想只是在开始迭代器之前通常不可能的容器。但这在大多数平台上仍然是可能的。std::vector
1赞 eerorika 5/14/2022
@anton_rh 别忘了数组也有迭代器:指针。改变指针和数组的规则将是对语言的根本改变,而不是掉以轻心的事情。
1赞 Goswin von Brederlow 5/14/2022
@anton_rh 在数组之前有一个指向元素的指针会格式不正确。它适用于大多数平台,但它不是任何 C++ 库可以依赖的,因为它不必总是工作。更改标准中允许指针的内容将是一个巨大的变化。
0赞 Eljay 5/14/2022
@anton_rh • 未定义的行为。你可以有一个指向 arr from to 的指针(但你不能取消引用 rray 末尾的那个;只能保证地址是有效的)。int main() { int arr[10]{ 1, 2, 3 }; int* p = arr; --p; }--p;&arr[0]&arr[10]arr[10]
1赞 Raymond Chen 5/14/2022
@anton_rh 即使您允许指针在数组的“开始之前”,它也可能无法按您预期的方式工作。例如,考虑一个恰好在 address 处分配的数组。“Before the beginning”指针下溢并变成一个非常大的正数,这意味着您遇到的情况是,数组的指针“Before the beginning”实际上大于数组中的所有指针。(委员会考虑了“在开始之前”的指针,并出于这样的原因拒绝了。struct large { char buffer[1000000]; };500000