2017-06-04 54 views
2

我有一個問題,在QList中使用STL算法:執行它時崩潰。 Debuger進一步進入lambda,所以在進入崩潰之前是。 (所以,如果列表爲空,則會在1次迭代中崩潰,如果列表中有1個元素 - 在2次迭代中等)。在Qt容器中使用STL算法

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

我該如何解決問題?

+1

你可能想用['標準:: back_inserter(信息搜索結果)'] (http://en.cppreference.com/w/cpp/iterator/back_inserter)作爲輸出迭代器 – WhiZTiM

+0

getStudentEntryList()不會返回副本,是嗎? – 2017-06-04 18:58:10

+0

你的問題不是真的Qt相關。它會和'std :: list'一樣崩潰。你看過正確的例子,說明使用'copy_if'嗎? –

回答

5

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