你如何使用C ++迭代器?

时间:2009-12-08 23:39:07

标签: c++ stl iterator

我有一个这样的矢量:

vector<MyType*> _types;

我想迭代向量并在向量中的每个MyTypes上调用一个函数,但是我从编译器得到了无效的返回错误。看起来pos迭代器不是指向MyType的指针,它是其他东西。我不理解的是什么?

编辑:一些代码..

    for (pos = _types.begin(); pos < _types.end(); pos++)
{
    InternalType* inst = *pos->GetInternalType();
}

编译器错误是:

  • 重载'运算符 - &gt;'的返回类型'InternalType **'无效
  • 'GetInternalType':不是'std :: _ Vector_iterator&lt; _Ty,_Alloc&gt;'的成员

编辑pt2

我的矢量是否应包含指针或对象?优缺点都有什么?如果我使用new来创建实例,我猜我只能使用指向MyType的指针向量是正确的吗?

5 个答案:

答案 0 :(得分:3)

如果向量包含对象而不是指针,则可以执行pos->foo()。迭代器“就像一个指针”。但是你的向量包含指针,因此迭代器将像指针一样指向,因此需要解除引用两次。

MyType *pMyType = *pos; // first dereference
if (pMyType) {          // make sure the pointer is not null
  pMyType->foo();       // second dereference
}

如果您确定指针不为null,则可以执行以下操作:

(*pos)->foo();

需要*pos周围的括号,因此取消引用适用于pos,而不是pos->foo()。运作顺序。

如果你的向量需要包含类层次结构中的项(例如,MyType的子类),那么你必须使它成为一个指针向量。否则,对象矢量可能更简单。

答案 1 :(得分:1)

您已将_types定义为指针向量。假设您的pos是该向量的迭代器,它将成为指针的迭代器,因此您需要将其取消引用两次以获取{{1}的实例}。

修改:根据您添加到问题中的内容:您有MyType之类的内容。请尝试使用*pos->whatever。您可以尝试使用(*pos)->whatever作为迭代器的成员,然后取消引用结果......

答案 2 :(得分:1)

迭代器不是指针。迭代器是行为类似于指针的类型。在某些容器的某些实现中,迭代器类型实际上可能是一个指针(所有指针都是迭代器),但这不能用作一般规则。

如果需要从迭代器生成指针,可以使用&*pos,它将取消引用迭代器,然后获取结果的地址(当然,如果一元{{1},这不起作用重载,但这是另一种蠕虫病毒。)

答案 3 :(得分:0)

for (vector<MyType*>::iterator i = _tpes.begin(); i != _types.end(); ++i) {
  // do something with i
}

答案 4 :(得分:0)

for (vector<MyType*>::iterator it = _types.begin();
     it != _types.end();
     ++it)
{
    // `*it` is this iteration's `MyType*` from your vector
}