【问题标题】:How to define the type of a member of an iterator class to work with STL container methods?如何定义迭代器类成员的类型以使用 STL 容器方法?
【发布时间】:2013-02-25 21:56:35
【问题描述】:

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

【问题讨论】:

  • 你到底想做什么和实现什么?
  • @AndyProwl: e_ 显然是std::vector&lt;element&gt; const &amp;
  • 你可能想看看boost.iterator
  • 你的函数调用e_.begin()返回一个const_iterator(这就是你的编译器似乎说的),而Iter.p是一个const指针element。因此,即使begin()返回的迭代器类型是指针,也无法进行转换。无论如何,std::vector&lt;&gt; 的迭代器保证是指针,尽管在大多数实现中它会是。
  • 很抱歉有歧义。 element 是一个结构体,定义在 std::vector e_.

标签: c++ stl iterator type-conversion


【解决方案1】:

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

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

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

当您在非const 容器上调用begin() 时,您会得到iterator 类型。当你在 const 迭代器上调用它时,你会得到一个 const_iterator 类型。由于您的a_begin 成员函数被标记为const 并且e_ 似乎是您班级的std::vector&lt;element&gt; 成员,因此e_ 是可传递的const,因此在其上调用begin() 也会给您一个@ 987654336@.

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

【讨论】:

  • “当你在非常量迭代器上调用 begin() 时”你的意思是容器?
【解决方案2】:

要么将迭代器类中的 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()成员方法直接访问vector的底层数组了。

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

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-17
    • 2012-11-18
    • 1970-01-01
    • 2011-03-02
    • 1970-01-01
    • 1970-01-01
    • 2021-08-22
    • 1970-01-01
    相关资源
    最近更新 更多