【问题标题】:isn't iterator an object?迭代器不是对象吗?
【发布时间】:2012-08-20 23:08:06
【问题描述】:

这是我的代码:

for (list<moveStringTree>::iterator tempIterator=moveList.begin();tempIterator!=moveList.end(); ++tempIterator)
{
    moveStringTree *move = tempIterator;
}

但它给了我一个错误。如果有铸道,我不喜欢。这太耗时了。无论如何,我想抛出一个列表并对其中的每个对象做一些事情。我能做些什么? foreach 无济于事。因为只有它会给出一个副本。

【问题讨论】:

  • 错误 1“初始化”:无法从“std::_List_iterator<_mylist>”转换为“moveStringTree *”

标签: c++ list for-loop iterator


【解决方案1】:

迭代器不是对象吗?

是的。 C++ 中的对象等价于保存一个值的内存位置——不多也不少。但是,我不明白这与问题的其余部分有何关系。

但它给了我一个错误。如果有铸道,我不喜欢。太费时间了。

我不知道这意味着什么。但是以防万一您的意思是复制:不,这可能不太耗时。但如果是的话——别担心;使用参考。

moveStringTree& move = *tempIterator;

foreach 无济于事。因为只有它会给出一个副本。

废话。 foreach 的作用与手动迭代相同。因此,您也可以将其与副本一起使用:

for (auto& o : moveList) {
    // Do something.
}

【讨论】:

    【解决方案2】:

    您可以使用迭代器就好像它是一个指针,但它实际上不是一个。不过,您可以通过一种舞蹈来从中获取指针:

    moveStringTree *move = &*tempIterator;
    

    * 解析为对迭代器引用的元素的引用,&amp; 返回该元素的地址。最终结果是一个指针。

    当然,您可能不应该这样做。这个:

    tempIterator->doSomething();
    

    工作得很好。

    【讨论】:

      【解决方案3】:

      试试:

      moveStringTree *move = & (*tempIterator) ;
      

      (括号不是绝对必要的)

      迭代器本身并不是指向对象的指针,而是重载 * 以返回对它所引用的对象的引用;从中你可以使用普通的 & 得到一个指针。

      请注意,通常您不需要这样做,因为迭代器还重载了 -> 运算符,因此您可以使用通常的 -> 语法访问对象的成员。

      【讨论】:

        【解决方案4】:

        其实你可以从std::for_each获得参考。 moveStringTree* move = &amp;*tempIterator; 是正确的。但是,更直接地,您可以简单地使用tempIterator,就好像它已经是一个指向相关对象的指针。

        for(auto it=moveList.begin();it!=moveList.end(); ++it) {
            it->f(); // well formed if moveStringTree::f()
        }
        

        【讨论】:

        • 这种情况下有问题。它给了我一个 const movelist
        猜你喜欢
        • 2018-02-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多