gpt4 book ai didi

C++ 迭代器和反向迭代器

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:30:22 25 4
gpt4 key购买 nike

我正在为当前对象编写一个iterator(实际上它是const_iterator,我还想创建一个reverse_const_iterator

我环顾四周,看看如何做到这一点,我偶然发现了 this :

Notice however that when an iterator is reversed, the reversed version does not point to the same element in the range, but to the one preceding it. This is so, in order to arrange for the past-the-end element of a range: An iterator pointing to a past-the-end element in a range, when reversed, is changed to point to the last element (not past it) of the range (this would be the first element of the range if reversed). And if an iterator to the first element in a range is reversed, the reversed iterator points to the element before the first element (this would be the past-the-end element of the range if reversed).

从用户的角度来看,这是发生了什么,或者当您取消引用 reverse_iterator 时,它不会通过为您提供您认为的对象的值/引用来抽象它吗?> 它指向什么?这只是实现细节吗?

我的理解是:

for(i = obj.rbegin(); i != obj.rend(); i++)

相当于

for(i = obj.begin(); i != obj.end(); i++)

反之除外。所以 *i 在第一种情况下会向后穿过容器,在第二种情况下会向前穿过容器。我的直觉是正确的吗?

最佳答案

你说得对,它是一种抽象。反向迭代器包含一个普通迭代器,它指向您在取消引用时将获得的对象之后的元素。然而,它不仅仅是一个实现细节。 std::reverse_iterator 适配器提供了一个返回底层迭代器的成员函数调用 base

标准将 std::reverse_iterator 定义为一个迭代器适配器,其适配迭代器具有以下关系:

The fundamental relation between a reverse iterator and its corresponding iterator i is established by the identity: &*(reverse_iterator(i)) == &*(i - 1)

base 的一个常见用途是从容器中删除一个元素,可以这样做:

it++;
lst.erase(it.base());

如果您想在反向迭代容器的同时执行此操作,您可以这样做:

it++;
std::list<int>::reverse_iterator(lst.erase(it.base()));

关于C++ 迭代器和反向迭代器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15109185/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com