Qt的foreach表达式需要深层复制吗?

时间:2013-01-14 11:21:09

标签: c++ qt foreach

我在使用Qt的foreach函数时遇到了一些问题。我有一个类Phrase,它是QList的子类。在〜Phrase中,我删除所有GlossItem指针。

在迭代Phrase中的GlossItem指针时,我想使用Qt的foreach:

    // phrase is a pointer to a Phrase object, 
    // which is a subclassed QList<GlossItem*>
    foreach( GlossItem *glossItem , *phrase )
    {
        // use glossItem
    }

由于某些原因,foreach正在对Phrase执行深层复制(我知道这是因为它需要我实现复制构造函数)。但如果有一个短语副本 - 如果我不想创建每个GlossItem的深层副本 - 这意味着这些指针将被删除两次。 (或者,删除一次,然后崩溃。)所以我必须使用它,它可以工作,但不太漂亮。

    for(int i=0; i<phrase->count(); i++ )
    {
        GlossItem *glossItem = phrase->at(i);
        // use glossItem
    }

有没有办法解决这个问题,还是只需要忍受它?

2 个答案:

答案 0 :(得分:6)

来自文档

  

Qt在进入foreach循环时会自动获取容器的副本。

  

由于foreach创建了容器的副本,因此对变量使用非const引用不允许您修改原始容器。

因此,我认为您的具体用例foreach不合适,否则您最终会获得Phrase的新副本以及其他指针,而不是返回实际的原始Phrase你要的那个。

答案 1 :(得分:1)

不,如果你查看从foreach扩展的代码:qt.gitorious.org/qt/qt/blobs/HEAD/src/corelib/global/qglobal.h#line2371 它使用const_iterator。是的,它会复制容器,但由于Qt中的所有容器类都是隐式共享的,因此它只是浅层副本,而不是深层副本。