2009-12-08 83 views
0

我有一个载体,像这样:你如何使用C++迭代器?

vector<MyType*> _types;

我想遍历向量,并呼吁每个向量MyTypes的功能,但我从编译器收到无效返回错误。看来pos迭代器不是指向MyType的指针,它是别的。我不了解什么?

编辑:一些代码..

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

编译器错误是:

  • 返回类型无效 'InternalType **' 重载 '运营商 - >'
  • 'GetInternalType':不是'std :: _ Vector_iterator < _Ty,_Alloc'的成员''

编辑pt2

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

+3

很难告诉你什么,当你甚至没有告诉我们什么,你什么都没有向我们展示过;) – Cogwheel 2009-12-08 23:39:49

+6

(* pos) - > GetInternalType() – Dan 2009-12-08 23:44:57

+1

“我的向量应该包含指针还是对象?如果它包含对象,则添加到该向量的对象将被复制到该向量中。对矢量中对象的更改不会影响原件。所以这取决于这是你想要的。 – 2009-12-08 23:50:36

回答

3

如果向量包含对象而不是指针,则可以使用​​。迭代器“充当”指针。但是你的向量包含指针,所以迭代器就像一个指向指针的指针,所以需要两次解除引用。

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

如果确定该指针不为空,你可以这样做:

(*pos)->foo(); 

需要围绕*pos括号所以提领适用于pos,不​​。操作顺序。

如果您的向量需要包含来自类层次结构(例如,MyType的子类)的项目,那么您必须将其作为指针向量。否则,对象的矢量可能更简单。

+0

感谢丹,我在这里需要的一切,特别是关于类层次结构的提示:) – morpeth 2009-12-09 00:01:21

1

您已将_types定义为指针向量。假设你的pos是这个向量的迭代器,它将成为一个指针的迭代器,所以你需要取消引用两次以得到MyType的一个实例。

编辑:根据你添加到问题:你有类似*pos->whatever。改为尝试(*pos)->whatever。现在,您试图使用whatever作为迭代器的成员,然后取消引用结果...

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

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

如果你需要生成一个迭代器的指针,可以使用&*pos,这将间接引用迭代器,然后得到的结果的地址(当然,这不一样,如果一元operator &工作过载,但是这一整套其他蠕虫)。