rend指向哪里?

fre*_*low 11 c++ pointers iterator stl vector

为了支持STL的半开放范围的概念,我们可以指出数组的一个接一个的结束.假设我们有一个三元素的向量.如果std::vector::iterator被实现为一个指针,如通常在释放的情况下建立,那么beginend指向这些位置:

    +---+---+---+....
    |   |   |   |   .
    +---+---+---+....
      ^           ^
    begin        end
Run Code Online (Sandbox Code Playgroud)

点表示一个过去的结束伪元素.既然没有一个在开始之前的东西,那究竟会rend指向哪个?让我说明一下:

    +---+---+---+....
    |   |   |   |   .
    +---+---+---+....
  ^           ^
rend       rbegin
Run Code Online (Sandbox Code Playgroud)

显然,插图是错误的,因为它rend是一个非法指针.所以我想std::vector::reverse_iterator即使在发布版本中,实现也永远不会成为指针.

我对吗?那么最有效的实施方式是reverse_iterator什么?

Gre*_*ill 5

因为您不允许取消引用指向容器外部的迭代器,所以实际上并不重要的是什么rend()"指向".它不必是合法的指针值,它可以是对容器/迭代器类型具有特定含义的任何值.

  • 在C中,如果指针未指向对象或超过对象的最后一个元素,并且该指针被评估(未解除引用),则行为未定义.这个问题是关于C++的,但我怀疑那里有什么不同.我想你应该澄清你的意思:容器外的点. (2认同)

Unc*_*ens 5

rbegin点的结果相同end(一个结束),结果rendbegin(第一个项目)相同.取消引用反向迭代器时,它将返回对范围中上一项的引用.


sel*_*tze 4

reverse_iteratora逻辑上指向的内容与其包含的迭代器指向的内容之间存在差异。从逻辑上讲,rbegin生成一个指向序列最后一个元素的迭代器,并rend生成一个指向开始之前的一个元素的迭代器。但这通常是使用基迭代器来实现的,该迭代器指向反向迭代器所指向的位置之后的下一个位置。像这样的东西:

template<class Iter>
class reverse_iter
{
    Iter base;
public:
    explicit reverse_iter(Iter it) : base(it) {}

    reference operator*() const {
        Iter tmp = base;
        --tmp;
        return *tmp;
    }

    reverse_iter& operator++() {--base; return *this;}
};
Run Code Online (Sandbox Code Playgroud)

因此,如果您使用 初始化这样的reverse_iter<>对象container.end(),则基本迭代器将指向末尾,但取消引用反向迭代器将为您提供最后一个元素。没有造成任何伤害。