在下面的代码段的两个** meaninings一个迭代器
vector<SceneObject *> sceneObjs;
vector<SceneObject *>::iterator iter;
iter = sceneObjs.begin();
while (iter != sceneObjs.end()){
cout << **iter <<endl;
iter++;
}
为什么** ITER有两个* S?
在下面的代码段的两个** meaninings一个迭代器
vector<SceneObject *> sceneObjs;
vector<SceneObject *>::iterator iter;
iter = sceneObjs.begin();
while (iter != sceneObjs.end()){
cout << **iter <<endl;
iter++;
}
为什么** ITER有两个* S?
第一个*取消引用迭代器,给出SceneObject *
指针。第二个*将这个SceneObject *
指针解除引用到SceneObject
本身。
因为*iter
是SceneObject *&
-a SceneObject
指针。您需要解除引用才能得到真实的SceneObject
。
因为*iter
返回SceneObject*
,然后它将再次被第二个*
解除引用。
第一个*
返回迭代器中的值,SceneObject*
指针。第二个*
推断那个指针,给出一个SceneObject
。我怀疑<<
有一个过载,它将SceneObject`呈现给一个流。
Ssh,不要告诉任何人,但'* iter'实际上是一个'SceneObject *&',但它并没有改变这里的其余部分。 –
@ R.MartinhoFernandes我真的不知道C++是否足够了,但我会将其纳入答案中,谢谢! – cnicutar
@cnicutar在这种情况下,参考部分没有任何区别。该引用使得使用迭代器的代码可以更改迭代器的内容(迭代器的指针,而不是迭代器内的指针指向的内存)。当你调用一个函数时,这个引用也很重要,它本身需要一个'SceneObject *&'引用,因为这个函数可以将* it的内容替换为另一个值。当你有一个函数'void setNull(SceneObject *&obj){obj = NULL;}'时,比调用'setNull(* iter);'设置迭代器的内容为NULL。 – Rudi