Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;迭代器和逆迭代器_C++_Iterator - Fatal编程技术网

C++ C++;迭代器和逆迭代器

C++ C++;迭代器和逆迭代器,c++,iterator,C++,Iterator,我正在为当前对象编写一个迭代器(实际上它是常量迭代器,我还想创建一个反向常量迭代器) 我环顾四周,想知道如何做到这一点,我无意中发现: 但是请注意,当迭代器反转时,反转的版本 不指向范围中的同一元素,而是指向 这是如此,为了安排过去的结束 范围元素:一个迭代器,指向一个超出范围中结束元素的元素 反转时,范围将更改为指向最后一个元素(不是 超过它)的范围(这将是范围的第一个元素,如果 如果范围中第一个元素的迭代器为 反转,反转迭代器指向第一个元素之前的元素 元素(如果 相反) 这是从用户的角度发生

我正在为当前对象编写一个
迭代器
(实际上它是
常量迭代器
,我还想创建一个
反向常量迭代器

我环顾四周,想知道如何做到这一点,我无意中发现:

但是请注意,当迭代器反转时,反转的版本 不指向范围中的同一元素,而是指向 这是如此,为了安排过去的结束 范围元素:一个迭代器,指向一个超出范围中结束元素的元素 反转时,范围将更改为指向最后一个元素(不是 超过它)的范围(这将是范围的第一个元素,如果 如果范围中第一个元素的迭代器为 反转,反转迭代器指向第一个元素之前的元素 元素(如果 相反)

这是从用户的角度发生的吗?或者当你取消引用一个
反向迭代器时,它不是通过给你你认为它指向的对象的值/引用来抽象掉它吗?这只是实现细节吗

我的理解是:

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

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

除了反向。因此,在第一种情况下,我将反向遍历容器,在第二种情况下,我将向前遍历容器。我的直觉正确吗?

这是一个抽象,你是对的。反向迭代器包含一个普通迭代器,它指向如果你取消引用将得到的对象后面的元素但是,这不仅仅是一个实现细节。
std::reverse_迭代器
适配器提供了一个成员函数调用
base
,它返回底层迭代器

本标准将
std::reverse_iterator
定义为迭代器适配器,迭代器与其适配关系如下:

反向迭代器与其对应的迭代器i之间的基本关系由标识建立:
&*(反向迭代器(i))==&*(i-1)

base
的一个常见用法是从容器中删除一个元素,操作如下:

it++;
lst.erase(it.base());
如果要在反向迭代容器时执行此操作,请执行以下操作:

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

作为一个附带问题,为什么获取底层的
迭代器
会有用?@Bingo:因为容器可能会期望它,例如,
擦除
被指定为使用
迭代器
,而不是
反向迭代器
。@Bingo:是的……除了上面提到的需要应用
--在基础迭代器上,而忘记这样做意味着它没有删除正确的元素。痛苦的经历。另一个附带问题…eep抱歉…如果我将
迭代器传递给
反向迭代器的构造函数,是否会自动将其转换为
反向迭代器
太好了?@Bingo它只需将
迭代器
包装在
反向迭代器
中。你的
反向迭代器
将“指向”迭代器
指向的元素之前的元素。附带说明:在使用迭代器时,你应该始终使用pre increment(
++i
)而不是增量后,因为它可以更有效。