0

我希望在向量上定义一个迭代器类,它的私有成员如何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
4

2 回答 2

1

根据您所提供的,我最多可以建议更改p为:

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

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

当你调用begin()一个非const容器时,你会得到一个iterator类型。const当你在迭代器上调用它时,你会得到一个const_iterator类型。由于您的a_begin成员函数已标记const并且e_似乎是std::vector<element>您的类的成员,因此e_是传递性的const,因此调用begin()它也会让您获得一个const_iterator.

但是很难准确地说出您在这里尝试做什么以及这是否是正确的方法。

于 2013-03-10T20:13:03.647 回答
1

在您的迭代器类中更改element* pconst 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;

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

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

希望这可以帮助。

于 2013-03-10T20:48:45.263 回答