2017-06-04 10 views
2

QListでSTLアルゴリズムを使用すると問題が発生します。実行中にクラッシュします。デバッガはラムダにもう一度足を踏み入れるので、クラッシュする前にエントリがあります。 (したがって、リストが空の場合、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

へのプッシュバックことになるだろうstd::back_insert_iteratorを作成するためにstd::back_inserterを使用する必要があります(http://en.cppreference.com/w/cpp/iterator/back_inserter)出力イテレータとして – WhiZTiM

+0

getStudentEntryList()はコピーを返しませんか? –

+0

あなたの問題は本当にQt関連ではありません。 'std :: list'と同じようにクラッシュします。 'copy_if'の使用を示す正しい例を見ましたか? –

答えて

5

std::copy_if要素をコピーするときに出力イテレータをインクリメントします。 searchResultは空のコンテナなので、searchResult.begin()を渡しました。同じくend()イテレータです。イテレータをインクリメント(ing)すると、end()イテレータは未定義ビヘイビアを呼び出します。

QList<T>push_back(T)メンバ関数をサポートしているので、あなたは[ ``のstd :: back_inserter(、検索結果を)]あなたはおそらく使用したいsearchResult

std::copy_if(model->getStudentEntryList().begin(), 
      model->getStudentEntryList().end(), 
      std::back_inserter(searchResult), 
      condition); 
関連する問題