在 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<T>
支持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 算法的主要内容,如果未能解决你的问题,请参考以下文章