我正在学习“迭代器”,并且对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;
}
cout<<*v1.begin();
返回9
但是
cout<<*v1.rend();
返回不为9的数字
为什么会有如此不同的结果?我需要一个答案,谢谢。
答案 0 :(得分:6)
在C ++中,范围由一对迭代器标记,这些迭代器分别标记范围的开始和位置,该位置在范围的末尾。对于容器,begin()
和end()
成员函数为您提供了一对到第一个和最后一个位置的迭代器。从end()
读取内容并不安全,因为它没有指向实际元素。
类似地,rbegin()
和rend()
成员函数返回分别指向最后位置和第一个位置的反向迭代器。出于同样的原因,取消引用end()
迭代器是不安全的(超出范围的末尾),您不应该取消引用rend()
迭代器,因为它没有指向内部的元素容器。
答案 1 :(得分:3)
取消引用end()
或rend()
具有不确定的行为。
begin()
指向第一个元素,rbegin()
指向最后一个元素。 end()
(在大多数情况下)指向最后一个元素之后的一个,rend()
有效指向第一个元素之前的一个(尽管不是那样实现的。)
答案 2 :(得分:3)
FirebaseInstanceId.getInstance().getInstanceId() .addOnCompleteListener(new OnCompleteListener<InstanceIdResult>() { @Override public void onComplete(@NonNull Task<InstanceIdResult> task) { if (!task.isSuccessful()) { Log.w(TAG, "getInstanceId failed", task.getException()); return; } // Get Instance ID token String token = task.getResult().getToken(); Toast.makeText(MainActivity.this, token, Toast.LENGTH_SHORT).show(); } });
和begin ()
有什么区别?
rend ()
将 iterator 返回到容器的第一个元素。
begin
将反向迭代器返回到容器的第一个元素之前的(它在反向迭代器范围的最后一个元素之后)。
rend
通过*v1.rend()
迭代器进行间接访问的行为是不确定的(通过rend
迭代器进行间接访问也是如此)。
为什么会有如此不同的结果?
除了在一种情况下未定义行为,而在另一种情况下未定义行为,由于它们所指的是不同的元素(其中一个是不存在的元素),因此几乎没有理由假定结果相同。
答案 3 :(得分:2)
vector::rend()
是C ++标准库中的内置函数,该函数返回一个反向迭代器,指向数组容器中第一个元素之前的理论元素。但是vector::begin()
返回指向向量中第一个元素的迭代器。
查看此代码:
for (auto it = v1.rbegin(); it != v1.rend(); it++)
cout << *it << " ";
相反的矢量元素是:
5 4 6 2 9
要迭代向量,请始终一起选择以下方法之一:
vector::begin()
和vector::end()
vector::cbegin()
和vector::cend()
vector::crbegin()
和vector::crend()
vector::rbegin()
和vector::rend()
有关更多信息,请参见"C++ Vector Tutorial With Example" by Ankit Lathiya。