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

时间:2011-12-23 17:27:14

标签: c++ pointers iterator

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

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的指针。

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

我是否错误地考虑了这个问题?

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

2 个答案:

答案 0 :(得分:14)

  

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

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

selectedObj = &*i;

在旁注中,您是否记得在循环之前使用selectedObj初始化NULL

答案 1 :(得分:6)

  

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

是。正如@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