繁体   English   中英

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

[英]how to define and access custom 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;
}

访问部分-in est.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;
}

PS:我刚刚保留了迭代器的相关部分-如果需要其他代码段,请告诉我。

一般来说:

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

您应该创建一个容器类和一个迭代器类。 后者应从std :: iterator <>派生。 您必须指定迭代器标记,返回值等。 根据迭代器标记,您应该实现运算符(递增,递减等)。 (或者更好的方法是,尽可能实现对数复杂度最高的方法,然后设置最佳的迭代器标签。)

因此,开始和结束应该返回您的迭代器。 看一下一些stl容器实现,它们并不难读。

在你的代码中

ou已经做了typdef T* iterator; 该行为指向T类型的指针起了另一个名字。 为了提高可读性,并使以后更改变得更容易,您应该返回带有begin和end的迭代器,因此:

iterator begin();
iterator end();

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

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

我认为unified_array是一个指针,所以我用了这种方式。

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

宣言:

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM