我可以获得指向当前迭代器值的指针

sla*_*ton 7 c++ pointers iterator

在我的班上,我有两个私人成员:

std::list<MyObject> objects;
MyObject *selecteObj;
Run Code Online (Sandbox Code Playgroud)

当一个事件发生时,我想遍历列表并运行某种测试,只会在列表中的一个项目上产生true.我想保存一个指向该项目的指针,以便在别处使用.

std::list<MyObject>::iterator i;
for (i = objects.begin(); i!=objects.end(); ++i){
    if (i->test())
        selectedObj = i;
}
Run Code Online (Sandbox Code Playgroud)

在其他地方另一种方法

if (selectedObj !=null)
    tmpObj->doSomething();
Run Code Online (Sandbox Code Playgroud)

但是这不起作用,因为i它不是指针,它是一个迭代器,即使你可以像对待指针一样对待它MyObject.

是否可以检索迭代器内部存储的指针以供在别处使用?

我错误地想到了这个吗?

完成我想要做的事情的正确方法是什么?

fre*_*low 15

是否可以检索迭代器内部存储的指针以供在别处使用?

当然,只需取消引用迭代器,*然后通过&以下方式获取指向对象的指针:

selectedObj = &*i;
Run Code Online (Sandbox Code Playgroud)

在一个侧面说明,你记得初始化selectedObjNULL循环之前?


Naw*_*waz 6

是否可以检索迭代器内部存储的指针以供在别处使用?

是.正如@FredOverflow所说,做到这一点:

selectedObj = &*i;
Run Code Online (Sandbox Code Playgroud)

但是,如果您可以使用C++ 11的功能,那么您可以使用基于范围的 for循环来编写更好的语法:

MyObject *selectedObj = NULL;
for (MyObject & obj : objects)
{
    if (obj.test())
        selectedObj = &obj; //store the address
}
Run Code Online (Sandbox Code Playgroud)

看起来更好?不需要迭代器和编写语法&*i.还应该注意的是,如果类MyObject已经重载operator &,那么&*i它将无法工作,因为它将调用该operator&函数,而不是获取对象的地址!如果是这样,那么你已经写了(MyObject*)&(char&)*i以获取地址*i,或者在C++ 11中你可以使用std::addressof(*i)哪些你可以自己定义,如果你不能使用C++ 11:

template< class T >
T* addressof(T& arg) {
    return (T*)&(char&)arg;
}
Run Code Online (Sandbox Code Playgroud)

代码取自:std :: addressof