如何编写以下"foreach"作为C++迭代器

nik*_*nik 0 c++ qt iterator

以下是从Qt应用程序中获取的代码示例.我想在"foreach"循环中编写与C++迭代器一样的循环.

DocumentWindow *MdiWindow::activeDocument()
{
  return qobject_cast<DocumentWindow*>(workspace->activeWindow());
}

int i=1;
foreach( QWidget *w, workspace->windowList() ) // workspace = new QWorkspace();
      {
        QString text;
        if( i<10 )
          text = tr("&%1 %2").arg( i++ ).arg( w->windowTitle() );
        else
          text = w->windowTitle();

        QAction *action = windowMenu->addAction( text );
        action->setCheckable( true );
        action->setChecked( w == activeDocument() );
        connect( action, SIGNAL(triggered()), mapper, SLOT(map()) ); // mapper = new QSignalMapper( this );
        mapper->setMapping( action, w );
}
Run Code Online (Sandbox Code Playgroud)

以下是我的尝试.它编译得很好,但只要在正在运行的应用程序中调用此代码就会崩溃.同时我不知道为什么.我做得对吗?

DocumentWindow *MdiWindow::activeDocument()
{
  return qobject_cast<DocumentWindow*>(workspace->activeWindow());
}

int i = 1;    
for(QWidgetList::iterator it = (workspace->windowList()).begin(); it != (workspace->windowList()).end(); ++it)
{
            QString text;
            if(i < 10)
                text = QString("&%1 %2").arg(i++).arg((*it)->windowTitle());
            else
                text = (*it)->windowTitle();

            QAction *action = windowMenu->addAction(text);
            action->setCheckable(true);
            action->setChecked((*it) == activeDocument());
            connect(action, SIGNAL(triggered()), mapper, SLOT(map()));
            mapper->setMapping(action, (*it));
}
Run Code Online (Sandbox Code Playgroud)

答:我没有意识到workspace-> windowList()按值返回,因此两个迭代器都指向容器的不同实例.

JPr*_*mer 5

workspace->windowList()在查询中多次调用将返回不同的容器,因此迭代器不是来自同一个集合.

将结果存储workspace->windowList()在局部变量中并对其进行迭代.

QWigetList winList = workspace->windowList() for(QWidgetList::iterator it = winList.begin(); it != winList.end(); ++it)

发生这种情况的原因是,按值而不是通过引用windowList()返回a QWidgetList.有关正在发生的事情的讨论,请参阅此问题.