Ich verwalte in einem Vector Zeiger auf Datenstrukturen. Zeiger deshalb, weil damit das Sortieren schneller geht. Da müssen dann ja nur die Zeiger verschoben werden und nicht die gesamten Daten.
In Abhängigkeit von einigen gesetzten Selektions Bits sollen jetzt einige der Daten sowie die zugehörigen Dateien gelöscht werden. Um Komplikationen mit dem Index (Iterator) zu vermeiden, will ich die Liste rückwärts abarbeiten. Das sieht dann etwa so aus:
1 2 3 4 5 6 7 8 9 10 | typedef struct { char * fname; char * uri_ptr; int mtime; long size; int flags; } Thumb_Info_t; ... std::vector<Thumb_Info_t*> * get_list( void ); ... |
und
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | void MainWindow::remove( void ) { std::vector<Thumb_Info_t*> * til; char buf[1024]; int mask = 0; unsigned it; ... til = thumb_list->get_list(); it = til->size(); while( it > 0 ) { --it; if( (*til)[it]->flags & mask ) { tbuf->append( "deleting:\n" ); sprintf( buf, "%s\n %d %s\n\n", (*til)[it]->uri_ptr, (*til)[it]->mtime, (*til)[it]->fname ); tbuf->append( buf ); if( std::remove( (*til)[it]->fname ) == 0 ) { delete [] (*til)[it]->fname; delete [] (*til)[it]->uri_ptr; //til->erase( it ); // error (1) til->erase( til->begin()+it ); // (2) } else { tbuf->append( "Remove error\n\n" ); } } } ... } |
In der Zeile, die mit (1) markiert ist, bekommen ich den Fehler:
thumbscan.cpp:799:28: error: no matching function for call to std::vector<Thumb_Info_t*>::erase(unsigned int&)’ til->erase( it );
Mit Zeile (2) funktioniert es. Den Unterschied kann ich jetzt nicht wirklich sehen. Aber ich frage mich, ob die Schleife, so wie sie jetzt ist, korrekt ist. Die Idee war eigentlich, das sich der Index (it) durch die Abarbeitung von hinten nicht ändert, da die Entfernung von zu löschenden Einträgen hinter dem Index diesen nicht beeinflusst. Aber durch die Fehlermeldung bin ich etwas verunsichert.
Sollte ich die Schleife vielleicht anders gestalten?