0

这是我的代码:

for (list<moveStringTree>::iterator tempIterator=moveList.begin();tempIterator!=moveList.end(); ++tempIterator)
{
    moveStringTree *move = tempIterator;
}

但它给了我一个错误。如果有铸道,我不喜欢。这太耗时了。无论如何,我想抛出一个列表并对其中的每个对象做一些事情。我能做些什么?foreach 无济于事。因为只有它会给出一个副本。

4

4 回答 4

3

迭代器不是对象吗?

这是。C++ 中的对象等价于保存一个值的内存位置——不多也不少。但是,我不明白这与问题的其余部分有何关系。

但它给了我一个错误。如果有铸道,我不喜欢。这太耗时了。

我不知道这是什么意思。但以防万一你的意思是复制:不,它可能不会太耗时。但如果是的话——别担心;使用参考。

moveStringTree& move = *tempIterator;

foreach 无济于事。因为只有它会给出一个副本。

废话。foreach 的作用与手动迭代相同。因此,您也可以将其与副本一起使用:

for (auto& o : moveList) {
    // Do something.
}
于 2012-08-25T20:39:33.623 回答
2

您可以像使用指针一样使用迭代器,但实际上它不是一个。但是,您可以通过一种舞蹈来从中获取指针:

moveStringTree *move = &*tempIterator;

*解析为对迭代器引用的元素的引用,并返回&该元素的地址。最终结果是一个指针。

当然,你可能不应该那样做。这:

tempIterator->doSomething();

工作得很好。

于 2012-08-25T20:36:01.280 回答
2

尝试:

moveStringTree *move = & (*tempIterator) ;

(括号不是绝对必要的)

迭代器本身并不是指向对象的指针,而是重载 * 以返回对它所引用的对象的引用;从中你可以使用普通的 & 得到一个指针。

请注意,通常您不需要这样做,因为迭代器也重载了 -> 运算符,因此您可以使用通常的 -> 语法访问对象的成员。

于 2012-08-25T20:36:54.090 回答
1

事实上,您可以从中获得参考std::for_eachmoveStringTree* move = &*tempIterator;会是正确的。但是,更直接地,您可以简单地使用tempIterator它,就好像它已经是指向相关对象的指针。

for(auto it=moveList.begin();it!=moveList.end(); ++it) {
    it->f(); // well formed if moveStringTree::f()
}
于 2012-08-25T20:36:16.433 回答