迭代器的指针操作问题

时间:2018-09-24 07:37:34

标签: c++ iterator

如果我有Rectangle类

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();"

还给我一个错误吗?

我了解到迭代器就像指针..要获取其内容,您应该尊重它。.

3 个答案:

答案 0 :(得分:4)

  

为什么

     

“ it-> getInfo();”

     

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

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

  

     

“ * it-> getInfo();”

     

给我一​​个错误?

operator->的{​​{3}}比operator*的值高,因此上面的表达式的计算方式就好像它被写为*(it->getInfo())一样,由于getInfo()不返回可以用operator*取消引用的类型。

即使编译器进行了另一种评估,(*it)->getInfo()也会失败,因为rectangle的{​​{1}}没有重载。

  

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

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

答案 1 :(得分:2)

it->getInfo();

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

*it->getInfo(); incorrect

(*it).getINfo();

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

答案 2 :(得分:0)

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

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();
}

请注意,循环变量rectconst限定的引用,现在不再是迭代器-因此,无需取消引用任何内容。