我能得到一个指向当前迭代器值的指针吗?

Can I get a pointer to a current iterator value

本文关键字:迭代器 指针 一个      更新时间:2023-10-16

在我的类中,我有两个私有成员:

std::list<MyObject> objects;
MyObject *selecteObj;

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

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

在其他方法

if (selectedObj !=null)
    tmpObj->doSomething();

然而,这不起作用,因为i不是指针,它是一个迭代器,即使你可以把它当作指向MyObject的指针。

是否可以检索迭代器内部存储的指针以供其他地方使用?

我想错了吗?

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

是否可以检索迭代器内部存储的指针以供其他地方使用?

当然,只要用*解引用迭代器,然后通过&获得指向对象的指针:

selectedObj = &*i;

顺便说一句,你记得在循环之前用NULL初始化selectedObj吗?

是否可以检索迭代器内部存储的指针以供其他地方使用?

是的。正如@FredOverflow所说,这样做:

selectedObj = &*i;
但是,如果您可以使用c++ 11的特性,那么您可以使用基于范围的 for循环编写更好的语法,如:
MyObject *selectedObj = NULL;
for (MyObject & obj : objects)
{
    if (obj.test())
        selectedObj = &obj; //store the address
}

看起来更好?不需要迭代器和编写像&*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;
}
std::addressof