迭代器的指针操作问题



>如果我有类矩形

Class rectangle{
//attribute
....
//methods
...
void getInfo() const;
}

和主要

int main(){
vector<Rectangle> v;
for (vector<Rectangle>::const_iterator it = v.begin() ; it != v.end(); ++it){
it->getInfo();
}
}

为什么

"it->getInfo();" 

返回有关所有矢量内容的正确值,并且

"*it->getInfo();"

返回错误?

我了解到迭代器就像指针......对于获取它的内容,你应该尊重它。

为什么

"it->getInfo((;"

返回有关所有矢量内容的正确值

it是一个迭代器。 可以取消引用迭代器以访问它引用的项,并且operator*operator->都是取消引用迭代器的可接受方法。it->getInfo()(*it).getInfo()相同。

"*it->getInfo((;">

返回错误?

operator->的优先级高于operator*,所以上面的表达式被计算为好像它被写成*(it->getInfo()),这失败了,因为getInfo()不返回可以用operator*取消引用的类型。

即使编译器以另一种方式对其进行评估,(*it)->getInfo()也会失败,因为rectangle没有重载operator->

我了解到迭代器就像指针一样。

喜欢指针,但不保证是指针。 所有指针都是迭代器,但并非所有迭代器都是指针。

it->getInfo();

是正确的,因为; 迭代器和 -> 正在取消引用它。

*it->getInfo(); incorrect
(*it).getINfo();

简而言之,-> 是 (*it(.getINfo(( 的快捷方式;在写作方面,最好阅读。

有两种方法可以取消引用指针,一种是通过*,另一种是通过->,其中后者必须后跟与点的静态类型关联的数据成员或成员函数。例:

void doStuff(const Rectangle&); 
Rectangle rect{/* ... */};
Rectangle *pointer = &rect;
doStuff(*pointer); // dereference the pointer
const double width = pointer->width(); // dereference and use a width() member function

这同样适用于迭代器,其中这些运算符是重载的。在您的情况下,

it->getInfo();
//^^ dereference the iterator

通过operator ->取消引用,而*it->getInfo()尝试取消引用getInfo()的返回类型,即void。顺便说一下,getInfo()返回void的成员函数是一个令人困惑的名称,您可能会想太多。让我在这里插入第二个建议:循环可以通过基于范围的 for 循环来简化,如下所示:

for (const Rectangle& rect : v) {
rect.getInfo();
}

请注意,循环变量rect是一个const限定引用,不再是迭代器 - 因此,无需取消引用任何内容。

最新更新