C ++迭代器运算符优先级问题* it.method()vs(* it).method()vs it-> method()

时间:2013-07-14 20:16:15

标签: c++ iterator

此代码无法编译:

for(vector<Box>::iterator it = shapes.end(); it >= shapes.begin(); --it){
    *it.update(1,1);
    *it.draw();
}

声称:

main.cpp:80:17: error: ‘std::vector<Box>::iterator’ has no member named ‘update’
main.cpp:81:17: error: ‘std::vector<Box>::iterator’ has no member named ‘draw’

但是AFAIK,该代码不会尝试调用vector :: iterator.draw(),它取消引用迭代器,它应该给我一个我的类框的对象,它有这些方法。 我做错了什么,抱歉这个糟糕的头衔。

2 个答案:

答案 0 :(得分:8)

这是运营商优先权的问题。

运算符.的优先级高于运算符*。使用括号首先强制运算符*应用程序。

(*it).update(1,1);
(*it).draw();

您还可以在迭代器上使用operator ->

it->update(1,1);
it->draw();

另请参阅:What is the difference between the dot (.) operator and -> in C++?cppreference: Member access operators

<小时/> @andre正确地说你也可以使用反向迭代器以相反的顺序迭代序列,但你应该正确使用它们。

for(vector<Box>::reverse_iterator it = shapes.rbegin(); it != shapes.rend(); ++it)
{
  it->update(1,1);
  it->draw();
}

答案 1 :(得分:1)

,添加@Pixelchemist的答案。

for(vector<Box>::iterator it = shapes.end(); it >= shapes.begin(); --it){
    *it.update(1,1);
    *it.draw();
}

应该是:

for(vector<Box>::reverse_iterator it = shapes.rbegin(); it != shapes.rend(); ++it){
    *it.update(1,1);
    *it.draw();
}

rendrbeing用于反向迭代。