Quố*_*ờng 1 c++ iterator vector
我正在学习“迭代器”,并且对begin()和rend()之间的区别有疑问。
#include <iostream>
#include <array>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
vector<int> v1;
v1 = {9,2,6,4,5};
cout<<*v1.begin();
cout<<*v1.rend();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
cout<<*v1.begin();
返回9
但
cout<<*v1.rend();
返回的数字不是9
为什么会有如此不同的结果?我需要一个答案,谢谢。
取消引用end()或rend()具有未定义的行为。
begin()指向第一个元素,rbegin()指向最后一个元素。end()(在大多数情况下)指向最后一个元素之后的一个并rend()有效地指向第一个元素之前的一个(尽管它不是那样实现的)。
在C ++中,范围由一对迭代器标记,这些迭代器标记了范围的开始和一个超出范围结束的位置。对于容器,begin()和end()成员函数为您提供一对到第一个和最后一个位置的迭代器。从中读取是不安全的end(),因为它没有指向实际的元素。
类似地,rbegin()和rend()成员函数返回分别指向最后位置和第一个位置的反向迭代器。出于同样的原因,取消引用end()迭代器是不安全的(超出范围的末尾),您不应取消引用rend()迭代器,因为它没有指向容器中的元素。
begin ()和 和有什么区别rend ()?
begin返回一个指向容器第一个元素的迭代器。
rend将反向迭代器返回到容器的第一个元素之前的元素(即反向迭代器范围中最后一个元素之后的元素)。
Run Code Online (Sandbox Code Playgroud)*v1.rend()
通过迭代器间接的行为rend是未定义的(通过迭代器间接的行为也是如此end)。
为什么会有如此不同的结果呢?
除了在一种情况下行为未定义而在另一种情况下未定义之外,因为它们引用不同的元素(其中之一是不存在的元素),所以没有理由假设结果相同。