gpt4 book ai didi

c++ - 如何将以下 "foreach"编写为 C++ 迭代器

转载 作者:太空宇宙 更新时间:2023-11-04 16:29:35 26 4
gpt4 key购买 nike

以下是从 Qt 应用程序中获取的代码示例。我想用 C++ 迭代器编写以下“foreach”循环作为 for 循环。

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 );
}

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

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));
}

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

最佳答案

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

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

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

发生这种情况的原因是 windowList() 按值而不是按引用返回 QWidgetList。参见 this question讨论正在发生的事情。

关于c++ - 如何将以下 "foreach"编写为 C++ 迭代器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8513440/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com