【问题标题】:Can I get a pointer to a current iterator value我可以获得指向当前迭代器值的指针吗
【发布时间】:2011-12-23 17:27:13
【问题描述】:

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

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

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

我是不是想错了?

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

【问题讨论】:

    标签: c++ pointers iterator


    【解决方案1】:

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

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

    selectedObj = &*i;
    

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

    【讨论】:

    • 你的意思是std::addressof(*i),不是吗? OP没有问如何调用对象的&amp;-operator...
    • @KerrekSB:我想,你的意思是std::addressof(而不是std::address_of),不是吗? :P
    • @Nawaz:哦,说了什么? ;-)
    【解决方案2】:

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

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

    selectedObj = &*i;
    

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

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

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

    template< class T >
    T* addressof(T& arg) {
        return (T*)&(char&)arg;
    }
    

    代码取自这里:std::addressof

    【讨论】:

      猜你喜欢
      • 2012-09-18
      • 2019-06-12
      • 2018-01-26
      • 1970-01-01
      • 1970-01-01
      • 2018-09-04
      • 2016-08-11
      • 2023-03-24
      • 2013-08-09
      相关资源
      最近更新 更多