如果我有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();"
还给我一个错误吗?
我了解到迭代器就像指针..要获取其内容,您应该尊重它。.
答案 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 = ▭
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
限定的引用,现在不再是迭代器-因此,无需取消引用任何内容。