fre*_*low 11 c++ pointers iterator stl vector
为了支持STL的半开放范围的概念,我们可以指出数组的一个接一个的结束.假设我们有一个三元素的向量.如果std::vector::iterator被实现为一个指针,如通常在释放的情况下建立,那么begin和end指向这些位置:
+---+---+---+....
| | | | .
+---+---+---+....
^ ^
begin end
Run Code Online (Sandbox Code Playgroud)
点表示一个过去的结束伪元素.既然没有一个在开始之前的东西,那究竟会rend指向哪个?让我说明一下:
+---+---+---+....
| | | | .
+---+---+---+....
^ ^
rend rbegin
Run Code Online (Sandbox Code Playgroud)
显然,插图是错误的,因为它rend是一个非法指针.所以我想std::vector::reverse_iterator即使在发布版本中,实现也永远不会成为指针.
我对吗?那么最有效的实施方式是reverse_iterator什么?
因为您不允许取消引用指向容器外部的迭代器,所以实际上并不重要的是什么rend()"指向".它不必是合法的指针值,它可以是对容器/迭代器类型具有特定含义的任何值.
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(),则基本迭代器将指向末尾,但取消引用反向迭代器将为您提供最后一个元素。没有造成任何伤害。