C++基于现有随机访问迭代器的反向迭代器
C++ reverse iterator based on existing random access iterator?
我通过继承非常基本的 std::itrator 模板类(见下文(,为我的自定义容器类实现了一个(非常量(随机访问迭代器。执行此操作所需的只是传入所需的类型。
我无法找到有关如何设置反向迭代器的太多信息,但是我很确定有一种方法可以将现有的迭代器与一些新的typedef一起使用并定义rbegin((和rend((。这就是我被困住的地方。有人可以帮忙吗?
template <class T, class A = std::allocator<T>>
class ring {
public:
typedef ring<T, A> self_type;
typedef T value_type;
typedef A alloc_type;
typedef ptrdiff_t size_type;
typedef typename alloc_type::difference_type difference_type;
typedef typename alloc_type::pointer pointer;
typedef typename alloc_type::reference reference;
typedef typename alloc_type::const_pointer const_pointer;
typedef typename alloc_type::const_reference const_reference;
class iterator; // we implement iterator as nested class, so no need to typedef it
iterator begin() { return iterator(this, 0); }
iterator end() { return iterator(this, size()); } // the current size (which is one past the end of the array)
class iterator : public std::iterator<std::random_access_iterator_tag, value_type, difference_type, pointer, reference> {
private:
self_type *ring_; // typedefs defined in ring class apply here
size_type offset_;
public:
iterator(self_type *r, size_type o) : ring_{r}, offset_{o} {}
reference operator* () const { return (*ring_)[offset_]; }
pointer operator-> () const { return &(operator*()); }
iterator& operator++ () {
++offset_;
return *this;
}
friend bool operator== (const iterator& it1, const iterator& it2) { return ((it1.ring_ == it2.ring_ && it1.offset_ == it2.offset_)); }
friend bool operator!= (const iterator& it1, const iterator& it2) { return (!(it1 == it2)); }
iterator& operator-- () {
--offset_;
return *this;
}
iterator operator++ (int) {
iterator clone(*this); // make a duplicate
++offset_;
return clone; // return the duplicate
}
iterator operator-- (int) { // has to be return by value
iterator clone(*this);
--offset_;
return clone;
}
iterator& operator+=(size_type n) {
offset_ += n;
return *this;
}
iterator& operator-=(size_type n) {
offset_ -= n;
return *this;
}
...
reference operator[] (size_type n) const { return (*ring_)[n]; }
};
};
您需要
定义reverse_iterator
类型别名以及rbegin
和rend
方法。 反向迭代器应使用 std::reverse_iterator
实现(在标头 <iterator>
中定义(
using reverse_iterator = std::reverse_iterator< iterator>;
using const_reverse_iterator = std::reverse_iterator<const_iterator>;
reverse_iterator rbegin() { return end (); }
const_reverse_iterator rbegin() const { return end (); }
reverse_iterator rend () { return begin(); }
const_reverse_iterator rend () const { return begin(); }
const_reverse_iterator crbegin() const { return rbegin(); }
const_reverse_iterator crend () const { return rend (); }
仅此而已。 没有魔法。
相关文章:
- 如何通过迭代器访问向量中的嵌套对?
- 有关使用矢量迭代器访问对象方法的问题
- C++中的 2D 迭代器访问
- 如何使用C STD :: SET中的迭代器访问成员功能
- 尝试使用矢量迭代器访问对象
- 使用迭代器访问元素
- 使用C++迭代器访问元素
- 使用矢量迭代器访问方法
- 嵌套迭代器访问
- 使用迭代器访问结构元素
- 使用迭代器访问向量的特定点
- 如何从 STL 列表中的迭代器访问指向结构的指针而不是其元素
- 通过迭代器访问字符串向量中的字符
- C++-映射迭代器访问导致segfault
- C++:从只能通过迭代器访问的数据类型中高效地提取元素子集
- 向量索引访问与迭代器访问的效率
- 仅使用迭代器访问c++stl映射
- C++工厂制造和多态性 ->调用由映射迭代器访问的实例的子类的虚拟方法
- 那么,是否可以像使用指针一样使用迭代器访问二维向量中的所有元素呢?
- 使用迭代器访问映射的特定键的最有效方法