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

C++ iterator operator precedence issue *it.method() vs (*it).method() vs it->method()

本文关键字:method vs it it- gt 运算符 问题 C++ 优先级 迭代器      更新时间:2023-10-16

这段代码无法编译:

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((,它会取消引用迭代器,这应该给我一个我的类框的对象,它确实有这些方法。我做错了什么,对不起这个糟糕的标题。

这是运算符优先级的问题。

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

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

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

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

另请参阅:点 (.( 运算符和 -> 在C++中有什么区别?和 cpp首选项:成员访问运算符。


@andre正确地指出,您也可以使用反向迭代器以相反的顺序迭代序列,但您应该正确使用它们。
for(vector<Box>::reverse_iterator it = shapes.rbegin(); it != shapes.rend(); ++it)
{
  it->update(1,1);
  it->draw();
}

以补充@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 用于反向迭代。