Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;迭代器运算符优先级问题*it.method()vs(*it).method()vs it->;方法()_C++_Iterator - Fatal编程技术网

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

C++ C++;迭代器运算符优先级问题*it.method()vs(*it).method()vs it->;方法(),c++,iterator,C++,Iterator,此代码不会编译: for(vector<Box>::iterator it = shapes.end(); it >= shapes.begin(); --it){ *it.update(1,1); *it.draw(); } for(vector::iterator it=shapes.end();it>=shapes.begin();--it){ *更新(1,1); *it.draw(); } 它声称: main.cpp:80:17: error: ‘s

此代码不会编译:

for(vector<Box>::iterator it = shapes.end(); it >= shapes.begin(); --it){
    *it.update(1,1);
    *it.draw();
}
for(vector::iterator it=shapes.end();it>=shapes.begin();--it){
*更新(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’
main.cpp:80:17:错误:“std::vector::iterator”没有名为“update”的成员
main.cpp:81:17:错误:“std::vector::iterator”没有名为“draw”的成员
不过,该代码并没有尝试调用vector::iterator.draw(),而是取消了对迭代器的引用,迭代器应该为我的类框提供一个对象,该类框中确实有这些方法。
我做错了什么,为这个糟糕的标题感到抱歉。

这是操作员优先权的问题

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

(*it).update(1,1);
(*it).draw();
您还可以在迭代器上使用
运算符->

it->update(1,1);
it->draw();
另见:和


@andre正确地指出,您也可以使用反向迭代器以反向顺序对序列进行迭代,但您应该正确地使用它们

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

也要添加@Pixelchemist的答案

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

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

rend
rbeing
用于反向迭代。

注意优先级<代码>*it.update(1,1)与
(*it)不同。更新(1,1)
,可以写成
it->update(1,1)为了可读性。谢谢,这非常有效,我认为它试图调用迭代器的update方法,然后取消引用该方法的输出。我会尽快接受。你说得对。(如果类型A的任何重载
操作符*
返回一个类型B的对象,该对象的成员函数具有与A相同的签名…),如果用
反向迭代器
替换
的类型,并迭代直到
它!=shapes.rend()
那么您的示例是正确的(最后^^);谢谢,这实际上解决了我遇到的另一个问题。您的循环条件仍在使用
运算符>=
。由于每个定义的结束迭代器都超过了数据的结尾,因此
=
将导致未定义的行为,即使
是正确的(事实并非如此)。如果您不想使用
=
然后将
>=
替换为
(这实际上是完全相反的代码!(>=)
,因为reverse\u迭代器是迭代器的对立面,所以您也必须反转条件。)