如何定义和访问自定义迭代器

时间:2015-10-27 21:49:37

标签: c++ iterator

我正在尝试创建一个自定义迭代器,我正在努力学习如何定义/声明并最终访问它的语法部分。以下是我的尝试,导致以下错误:

Error   C2440   'initializing': cannot convert from 'int' to 'int *'

如果有人可以指出我正确的方式来定义/声明它 - 那会很棒,因为我相信我的访问方法是标准的。

声明

template <typename T>
class ddeque
{
public:
    typedef T* iterator;
    T& begin();
    T& end();
}

定义

template<typename T>
T& ddeque<T>::begin()
{
    iterator = &(this->unified_array());
    return iterator;
}

template<typename T>
T& ddeque<T>::end()
{
    iterator = &(this->unified_array + this->size());
    return iterator;
}

访问部分 - 在t \ test.cpp 文件中

//将自定义模板中的值与标准模板进行比较

typename ddeque<T>::iterator itt = a.begin();
typename deque<T>::iterator ittg = g.begin();
while ((itt != a.end()) && (ittg != g.end())) 
{
   if (display) 
   {
     cout << *itt << " ";
   }
   ++itt;
   ++ittg;
}

P.S:我刚刚保留了迭代器的相关部分 - 如果需要额外的代码片段,请告诉我。

2 个答案:

答案 0 :(得分:0)

一般情况下:

  

如何定义和访问自定义迭代器

你应该创建一个contaner类和一个迭代器类。后者应来自std::iterator<>。您必须指定迭代器标记,返回值等。根据迭代器标记,您应该实现运算符(递增,递减等)。 (或者更好的是,实现具有最大对数复杂度的所有内容,然后设置最佳迭代器标记。)

所以开始,结束应该返回你的迭代器。看看一些stl容器实现,它们不是那么难读。

在您的代码中

你已经typdef T* iterator;了。此行为指向T类型的指针生成另一个名称。为了便于阅读,并且为了以后更容易更改,您应该使用begin和end返回迭代器,所以:

iterator begin();
iterator end();

在上面函数的定义中,你不能为迭代器类型赋值,我建议返回指针(或迭代器),例如在end()中:

return this->unified_array + this->size();

我认为unified_array是指针,所以我就这样使用它。

答案 1 :(得分:0)

正如SO成员АндрейБеньковский所指出的那样,我正在返回引用而不是指针 - 正确的定义解决方案将是(它使它工作的原因)

<强>声明:

template <typename T>
class ddeque
{
public:
    typedef T* iterator;
    iterator begin();
    iterator end();
}

<强>定义     模板     T * ddeque :: begin()     {         iterator =&amp;(this-&gt; unified_array());         返回迭代器;     }

template<typename T>
T* ddeque<T>::end()
{
    iterator = &(this->unified_array + this->size());
    return iterator;
}