Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/136.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++_Stl_Iterator - Fatal编程技术网

C++ 迭代器值与转换后的反向迭代器值不同

C++ 迭代器值与转换后的反向迭代器值不同,c++,stl,iterator,C++,Stl,Iterator,我有以下代码: int main() { vector<int> v; for(int i = 0; i < 10; ++i) v.push_back(i); auto it = v.begin() + 3; cout << "Iterator: " << *it << endl; vector<int>::reverse_iterator revIt(it);

我有以下代码:

int main()
{
    vector<int> v;

    for(int i = 0; i < 10; ++i)
        v.push_back(i);

    auto it = v.begin() + 3;

    cout << "Iterator: " << *it << endl;

    vector<int>::reverse_iterator revIt(it);

    cout << "Reverse iterator: " << *revIt << endl;

}

有人能解释为什么这两个值不同吗?

看起来像是说他们这样做是为了处理结束元素之后的元素,也就是说,如果你反转一个已经结束的迭代器,新的反向迭代器会指向最后一个元素。

24.5.1反向迭代器的第一段说:

类模板反向迭代器是一个迭代器适配器,它从底层迭代器定义的序列的末尾迭代到序列的开头。反向迭代器与其对应的迭代器i之间的基本关系由标识建立:
&*(反向迭代器(i))==&*(i-1)


rend()
返回的值不能指向
begin()
之前,因为该值无效。因此决定
rend()
应包含
begin()
的值,并且所有其他反向迭代器应进一步移动一个位置。
操作符*
对此进行补偿并访问正确的元素。

反向迭代器“对应”于偏移量为一个元素的
基迭代器,因为
rbegin()
rend()
必须使用有效的基迭代器(
end()
begin()来表示
分别)。例如,
rend()。所以
rend()
的“基本迭代器”是
begin()
。因此,
rbegin()
的基本迭代器变为
end()
。 反向迭代器在取消引用时自动调整偏移量(使用
*
->
运算符)

一位老人详细解释了这一关系,并附上了一张漂亮的照片:

准则3:了解如何使用反向迭代器的基本迭代器

在反向迭代器上调用基成员函数会产生 “对应”迭代器,但并不清楚这意味着什么。 作为一个例子,看看这段代码,它将数字1-5放入 一个向量,设置一个反向迭代器指向3,并设置一个 到反向迭代器基的迭代器:

vector<int> v;

// put 1-5 in the vector
for (int i = 1; i <= 5; ++i) {
  v.push_back(i);
}

// make ri point to the 3
vector<int>::reverse_iterator ri =
  find(v.rbegin(), v.rend(), 3);

// make i the same as ri's base
vector<int>::iterator i(ri.base());
向量v; //将1-5放入向量中
对于(int i=1;i反向迭代器总是“一个在前”,然后是正向迭代器,因为它的范围移动了一:

前向迭代器从begin()(第一个元素)到end()(超过最后一个:[begin end]在结束端打开)


根据定义,反向迭代器从
rbegin(){return Reverse_iterator(end());}
rend(){return Reverse_iterator(begin());}
,但也必须在开放范围[rbegin rend]内运行,使rbegin成为最后一个(而不是“超过最后一个”),并使rend成为“在第一个之前”(而不是“第一个”)因此需要适应1的差异。

我不是100%确定,但是正向迭代器会向前看,而反向迭代器会向后看。
v={1,2,*3,4…}
其中*是这两个迭代器的位置。看看它们朝哪个方向走。@chris:不完全是这样的:或者更好,这是java定义迭代器的方式C++(C++)有一个不同的概念,但是实际结果也符合你的解释。但是,结果是,不是定义。@ EmilioGaravaglia,谢谢你把它清理出来。这不是我所熟悉的。
vector<int> v;

// put 1-5 in the vector
for (int i = 1; i <= 5; ++i) {
  v.push_back(i);
}

// make ri point to the 3
vector<int>::reverse_iterator ri =
  find(v.rbegin(), v.rend(), 3);

// make i the same as ri's base
vector<int>::iterator i(ri.base());