begin()和rend()有什么区别?

时间:2019-06-15 17:19:45

标签: c++ vector iterator

我正在学习“迭代器”,并且对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的数字

为什么会有如此不同的结果?我需要一个答案,谢谢。

4 个答案:

答案 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

Try it online