提问人:anton_rh 提问时间:5/14/2022 最后编辑:wohlstadanton_rh 更新时间:5/14/2022 访问量:169
为什么 std::reverse_iterator 比直接迭代器慢?
Why is std::reverse_iterator slower than a direct iterator?
问:
我注意到在取消引用之前总是递减内部迭代器的副本:std::reverse_iterator
_GLIBCXX17_CONSTEXPR reference
operator*() const
{
_Iterator __tmp = current;
return *--__tmp;
}
这是GNU标准C++库中的实现。cppreference.com 以同样的方式实现它。
问题:在反向迭代器构造函数中只递减一次,而不是在每个取消引用步骤中递减它不是更有效吗?
答:
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
评论
begin