开始 () 和结束 () 有什么区别

What is the difference between begin () and rend ()?

本文关键字:什么 区别 开始 结束      更新时间:2023-10-16

我在迭代器中有一个关于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 的数字

为什么会有如此不同的结果?

在C++中,范围由一对迭代器标记,标记范围的开始和超过范围结束的位置。对于容器,begin()end() 成员函数为您提供了一对指向第一个和过去结束位置的迭代器。从end()中读取是不安全的,因为它不指向实际的元素。

同样,rbegin()rend() 成员函数返回反向迭代器,分别指向最后一个位置和第一个位置之前。出于同样的原因,取消引用end()迭代器是不安全的(它已经过了范围的末尾(,你不应该取消引用rend()迭代器,因为它不指向容器中的元素。

取消引用end()rend()具有未定义的行为。

begin()指向第一个元素,rbegin()指向最后一个元素。 end()(在大多数情况下(指向最后一个元素之后的一个元素,rend()有效地指向第一个元素之前的一个元素(尽管它不是这样实现的(。

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

begin迭代器返回到容器的第一个元素

rend反向迭代器返回到容器的第一个元素之前的 1(该元素比反向迭代器范围中的最后一个元素高出一个(。

*v1.rend()

通过rend迭代器进行间接处理的行为是未定义的(通过迭代器进行间接end也是如此(。

为什么会有如此不同的结果?

除了行为在一种情况下未定义而不是另一种情况下未定义之外,由于它们指的是不同的元素(其中一个元素是不存在的元素(,因此几乎没有理由假设结果是相同的。

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

有关更多信息,请参阅 Ankit Lathiya 的"C++ Vector Tutorial with Example"。

在线试用