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());