我在 cppreference 中了解了 std::vector
数据类型.目前在成员类型中,我看到了 iterator
data_type。
我确实知道 iterator
要求 LegacyRandomAccessIterator
。但是如何使用我自己的模板类定义 LegacyRandomAccessIterator 迭代器
data_type?
template <typename T>
class vec {
typedef T value_type;//correct
typedef LegacyRandomAccessIterator iterator;//error
};
我尝试使用 typedef LegacyRandomAccessIterator 迭代器
,但失败了。如何在我的自定义类中定义一个 iterator
表示 LegacyRandomAccessIterator
?
最佳答案
您需要一个具有以下运算符的类型,其含义与指针相同。
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
的非成员(member)因为最左边的参数可以改为成员。而不是提供 difference_type
, value_type
, pointer
, reference
和 iterator_category
,您可以提供(部分)特化 std::iterator_traits<vec_iterator<T>>
使用那些 typedef。
关于C++ 将 typedef 与 LegacyRandomAccessIterator 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57456285/