在 Qt 容器中使用 STL 算法

Posted

技术标签:

【中文标题】在 Qt 容器中使用 STL 算法【英文标题】:Using STL algorithms with Qt containers 【发布时间】:2017-06-04 18:49:27 【问题描述】:

我有一个问题,使用带有 QList 的 STL 算法:执行时崩溃。调试器在 lambda 中又迈出了一步,所以在崩溃之前是 . (因此,如果列表为空,则在 1 次迭代时崩溃,如果列表有 1 个元素 - 在 2 次迭代时等)。

void FindDialog::findEntries()

    QList<StudentEntry> searchResult;

    condition = [this] (const StudentEntry &entry) -> bool 
                // crashes here 
                return entry.name.getSurname() == surnameEdt1->text() &&
                       entry.group.getValue() == groupEdt->text();
                ;

    std::copy_if(model->getStudentEntryList().begin(),
                 model->getStudentEntryList().end(),
                 searchResult.begin(),
                 condition);

我该如何解决这个问题?

【问题讨论】:

你可能想使用std::back_inserter(searchResult)作为你的输出迭代器 getStudentEntryList() 不会返回副本,是吗? 您的问题与 Qt 无关。它会与std::list 一样崩溃。你看过正确的例子来证明copy_if的用法吗? 【参考方案1】:

std::copy_if 在复制元素时递增输出迭代器。你传递了searchResult.begin(),它同样是一个end() 迭代器,因为searchResult 是一个空容器。并且递增(ing)一个迭代器通过 end() 迭代器调用未定义的行为。

由于QList&lt;T&gt; 支持push_back(T) 成员函数,您应该使用std::back_inserter 创建一个std::back_insert_iterator,它将对searchResult 进行回推

std::copy_if(model->getStudentEntryList().begin(),
             model->getStudentEntryList().end(),
             std::back_inserter(searchResult),
             condition);

【讨论】:

以上是关于在 Qt 容器中使用 STL 算法的主要内容,如果未能解决你的问题,请参考以下文章

Qt学习之路(49): 通用算法

Qt容器类之一:Qt的容器类介绍

STL常用算法的使用与实现举例

STL常用算法的使用与实现举例

在Qt编程中,如何调用C++的STL?

论Qt容器与STL