繁体   English   中英

如何定义迭代器类的成员类型以使用STL容器方法?

[英]How to define the type of a member of an iterator class to work with STL container methods?

我希望在向量上定义一个迭代器类,它的私有成员p如何匹配std :: vector :: begin()的返回类型?

class A{

struct element{
      ...
}

  class e_iterator {

  e_iterator() : p()

    ...

    private:
      element* p;  
  };

  e_iterator e_begin() const{
     e_iterator Iter;
     Iter.p = e_.begin(); // error
     return Iter;
  }

 std::vector<element> e_; 

我收到element* p的错误:

error: cannot convert 'std::vector<element, std::allocator<element>>::const_iterator' to 'element*' in assignment

根据你给出的,我建议的最多是将p改为:

std::vector<element>::const_iterator p;

简单的事实是std::vector迭代器不是指针(可能)。 它是一种未指定的类型,其行为类似于指针 - 它满足随机访问迭代器的要求。

在非const容器上调用begin()时,会得到iterator类型。 const迭代器上调用它时,会得到一个const_iterator类型。 由于你的a_begin成员函数被标记为conste_似乎是你的类的std::vector<element>成员,所以e_是传递const ,所以在它上面调用begin()也会得到一个const_iterator

但是很难准确地说出你在这里想做什么,以及这是否是正确的方法。

在迭代器类中将element* p更改为const element* p或从e_begin()方法中删除const限定符。 或者提供const / non-const迭代器。 我还建议初始化迭代器构造函数中的指针:

template <bool isconst>
class e_iterator_ {

  public:
    typedef std::conditional<isconst, const element*, element*>::type elementptr;

    e_iterator_(elementptr e) : p(e)

  ...

  private:
    elementptr p;  
};

typedef e_iterator_<true> const_e_iterator;
typedef e_iterator_<false> e_iterator;

然后你可以使用std :: vector的data()成员方法直接访问向量的底层数组。

  e_iterator e_begin() const{
     const_e_iterator Iter(e_.data());
     return Iter;
  }

希望这可以帮助。

暂无
暂无

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

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