C++迭代器运算符优先级问题 *it.method() vs (*it).method() vs it->method()
C++ iterator operator precedence issue *it.method() vs (*it).method() vs it->method()
这段代码无法编译:
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();
}
rend
和 rbeing
用于反向迭代。
相关文章:
- 在VS代码中交叉编译Windows与Linux上的MinGW的SDL程序
- 如何为模板化对象创建模板向量?VS正在投掷C3203
- 数据成员SFINAE的C++17测试:gcc vs clang
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- 在for循环中使用auto vs decltype(vec.size())来处理字符串的向量
- 正在VS调试器中监视映射条目
- Confusion: decltype vs std::function
- 将IBM Rhapsody模型集成到VS 2019中
- VS Code "command":"make"与终端窗口中的命令行"make"不同
- 使用VS Code和CMake Tools运行自定义命令
- 修改 VS Code 中的默认C++代码段
- 如何使用c++在VS 2019上运行SQL查询
- vs 2015 constexpr变量不恒定,但与2019相比还好吗
- 通过 get-Method 访问变量在类外不起作用
- 完美前进使用 std::forward vs RefRefCast
- 从VS 2015更新3更新到VS2015更新3 d后浮点计算行为不同的原因
- (*it)->method() vs (**it).method
- getInstance - Class vs Method static
- C++迭代器运算符优先级问题 *it.method() vs (*it).method() vs it->method()
- QMetaObject::invokeMethod(object, method, stuff+params) vs object->method()