C++ 将 typedef 与 LegacyRandomAccessIterator 一起使用

标签 c++

我在 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 , referenceiterator_category ,您可以提供(部分)特化 std::iterator_traits<vec_iterator<T>>使用那些 typedef。

关于C++ 将 typedef 与 LegacyRandomAccessIterator 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57456285/

相关文章:

c++ - 使用 for 、if 和 else 的正确 openmp 实现

c++ - 未解析的外部符号,C++,VS 2015

c++ - 覆盖和最终的编译器要求

Linux 和 Windows 之间的 C++ std::map 差异

c++ - Std::cout 不打印预期的 float ?

c++ - 设置 HWND TXT 颜色

C++ Windows 二进制文件 : conditions to be used with MinGW

c++ - 为什么这个递归算法对输入 2,147,483,647 给出错误答案?

c++ - 编写递归 C++ 函数,计算并返回数组中整数的乘积

c++ - 在 C++ 中计算 Sprite 的坐标