2017-06-04 1 views
2

Ich habe ein Problem, STL-Algorithmus mit QList verwenden: während der Ausführung stürzt ab. Deburger macht noch einen Schritt in Lambda, also vor dem Crash-Einstieg ist. (Wenn also die Liste leer ist, stürzt sie bei 1 Iteration ab, wenn die Liste 1 Element enthält - bei 2 Iterationen usw.).Verwenden von STL-Algorithmen mit Qt-Containern

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

Wie kann ich das Problem lösen?

+1

Sie wahrscheinlich verwenden möchten, tun [ 'std :: back_inserter (search)'] (http://en.cppreference.com/w/cpp/iterator/back_inserter) als Ausgabe-Iterator – WhiZTiM

+0

getStudentEntryList() gibt keine Kopie zurück, oder? –

+0

Ihr Problem ist nicht wirklich Qt-bezogen. Es wird genau so mit 'std :: list' abstürzen. Haben Sie sich die richtigen Beispiele für die Verwendung von 'copy_if' angesehen? –

Antwort

5

std::copy_if erhöht den Ausgabe-Iterator beim Kopieren von Elementen. Sie haben es searchResult.begin() übergeben, die ebenfalls ein end() Iterator ist, da searchResult ein leerer Container ist. Und inkrementieren (ing) ein Iterator übergab den end() Iterator Undefined Behavior.

seit QList<T> unterstützt eine push_back(T) Member-Funktion, sollten Sie std::back_inserter verwenden, um eine std::back_insert_iterator zu erstellen, die die zurückschieben zu searchResult

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