我有一个这样的矢量:
vector<MyType*> _types;
我想迭代向量并在向量中的每个MyTypes上调用一个函数,但是我从编译器得到了无效的返回错误。看起来pos
迭代器不是指向MyType的指针,它是其他东西。我不理解的是什么?
编辑:一些代码..
for (pos = _types.begin(); pos < _types.end(); pos++)
{
InternalType* inst = *pos->GetInternalType();
}
编译器错误是:
编辑pt2
我的矢量是否应包含指针或对象?优缺点都有什么?如果我使用new
来创建实例,我猜我只能使用指向MyType的指针向量是正确的吗?
答案 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
}