C ++将Typedef与LegacyRandomAccessIterator一起使用

时间:2019-08-12 06:02:31

标签: c++

我了解了cppreference中的std::vector数据类型。目前在会员类型中,我看到了iterator data_type。

我确实知道iterator的要求LegacyRandomAccessIterator。但是如何使用自己的模板类定义LegacyRandomAccessIterator iterator data_type?

template <typename T>
class vec {
    typedef  T value_type;//correct
    typedef LegacyRandomAccessIterator iterator;//error
};

我尝试使用typedef LegacyRandomAccessIterator iterator,但失败了。如何在自定义类中定义iterator代表LegacyRandomAccessIterator的地方?

1 个答案:

答案 0 :(得分:1)

您需要一个具有以下运算符的类型,其含义与使用指针的含义相同。

template <typename T>
class vec_iterator
{
    typedef std::ptrdiff_t difference_type;
    typedef T value_type;
    typedef T* pointer;
    typedef T& reference;
    typedef std::random_access_iterator_tag iterator_category;

    vec_iterator();

    reference operator*();
    pointer operator->();

    vec_iterator& operator++();
    vec_iterator operator++(int);
    vec_iterator& operator--();
    vec_iterator operator--(int);

    vec_iterator& operator+=(difference_type);
    vec_iterator& operator-=(difference_type);

    reference operator[](difference_type);
};

template <typename T>
bool operator ==(vec_iterator<T>, vec_iterator<T>);
template <typename T>
bool operator !=(vec_iterator<T>, vec_iterator<T>);

template <typename T>
bool operator <(vec_iterator<T>, vec_iterator<T>);
template <typename T>
bool operator <=(vec_iterator<T>, vec_iterator<T>);
template <typename T>
bool operator >(vec_iterator<T>, vec_iterator<T>);
template <typename T>
bool operator >=(vec_iterator<T>, vec_iterator<T>);

template <typename T>
vec_iterator<T> operator +(vec_iterator<T>, typename vec_iterator<T>::difference_type);
template <typename T>
vec_iterator<T> operator +(typename vec_iterator<T>::difference_type, vec_iterator<T>);

template <typename T>
vec_iterator<T> operator -(vec_iterator<T>, typename vec_iterator<T>::difference_type);
template <typename T>
vec_iterator<T> operator -(typename vec_iterator<T>::difference_type, vec_iterator<T>);

请注意,T*是满足 RandomAccessIterator 的类型。

vec_iterator作为最左边参数的非成员可以成为成员。除了提供difference_typevalue_typepointerreferenceiterator_category之外,您还可以为这些typedef提供(部分)专业化std::iterator_traits<vec_iterator<T>>

相关问题