【问题标题】:What is the difference between begin () and rend ()?begin() 和rend() 有什么区别?
【发布时间】:2019-06-15 17:19:45
【问题描述】:

我在迭代器中有一个关于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&lt;&lt;*v1.begin(); 返回 9

但是 cout&lt;&lt;*v1.rend(); 返回一个不是 9 的数字

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

【问题讨论】:

  • rend().base() == begin().
  • rend() 返回“past-the-end”迭代器,就像end() 一样。取消引用它是未定义的行为。 (好吧,rend() 更像是“开始之前”,但你明白了)。
  • rend 是结尾的反向迭代器(原始向量的开头),begin 是开头的迭代器
  • 这是一个相关问题:Why use rbegin() instead of end() - 1
  • v1.begin() &lt;=&gt; --v1.rend()

标签: c++ vector stl iterator


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 它是“一个结束”,因此您的循环可以在条件it == end()(当然是rend())上结束并获取范围内的每个元素。 (当然,在循环中,结束条件是你想要的 negative 所以它写成it != end() 但这很明显。)
    • “虽然它不是那样实现的” 为什么不呢?
    • @LightnessRacesinOrbit 不适用于所有容器,但是例如,您不能使用指针算法来获取数组第一个元素之前的元素地址,就像您可以获取最后一个元素一样,你能?
    • @eerorika 哦,是的:D
    【解决方案3】:

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

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

    rend反向迭代器返回到容器的第一个元素之前(即反向迭代器范围内的最后一个元素之后)。

    *v1.rend()
    

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

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

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

    【讨论】:

      【解决方案4】:

      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

      【讨论】:

      • 链接的文章中发生了一些奇怪的事情。喜欢:“vector::assign() 是 C++ 中的 STL” o.O
      猜你喜欢
      • 2020-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-21
      • 2015-10-14
      • 2018-11-23
      • 2014-12-05
      • 1970-01-01
      相关资源
      最近更新 更多