Freezedevil
Lieutenant
- Registriert
- Mai 2011
- Beiträge
- 651
Hi,
ich habe folgenden Code welcher sich ueberschneidende Intervalle innerhalb eines Vectors zusammenfuegen soll. Ein Intervall besteht hierbei aus zwei ints fuer jeweils den Start- und Endpunkt. Enthaelt der Vector also die Intervalle
3-5
7-9
4-8
11-15
10-12
Soll er nach dem merge so aussehen
3-9
10-15
Das ganze funktioniert soweit ich das bisher beurteilen kann mit dem folgenden Code auch.
Mir bereitet es nur ein wenig Bauchschmerzen, dass mir valgrind ein 'Invalid read of size 4' in der Zeile mit dem erase unterstellt. Ausserhalb der Methode kann es keine Iteratoren geben die durch das Loeschen invalidiert werden, da ich nur Kopien des Vectors nach aussen gebe. it sollte meiner Recherche nach nicht invalidiert werden, da er immer vor der Stelle steht an der geloescht wird und jt wird ja direkt wieder auf einen gueltigen Punkt gesetzt.
Ich waere ueber Ideen wie es zu diesem Fehler kommen kann sehr dankbar.
ich habe folgenden Code welcher sich ueberschneidende Intervalle innerhalb eines Vectors zusammenfuegen soll. Ein Intervall besteht hierbei aus zwei ints fuer jeweils den Start- und Endpunkt. Enthaelt der Vector also die Intervalle
3-5
7-9
4-8
11-15
10-12
Soll er nach dem merge so aussehen
3-9
10-15
Das ganze funktioniert soweit ich das bisher beurteilen kann mit dem folgenden Code auch.
Code:
static void sortMerge(std::vector<Interval>* intervals) {
std::sort(intervals->begin(), intervals->end());
for (std::vector<Interval>::iterator it = intervals->begin(); it != intervals->end(); ++it) {
std::vector<Interval>::iterator jt = std::next(it);
while(it->end >= jt->start && jt != intervals->end()) {
it->end = it->end >= jt->end ? it->end : jt->end;
jt = intervals->erase(jt);
}
}
}
Mir bereitet es nur ein wenig Bauchschmerzen, dass mir valgrind ein 'Invalid read of size 4' in der Zeile mit dem erase unterstellt. Ausserhalb der Methode kann es keine Iteratoren geben die durch das Loeschen invalidiert werden, da ich nur Kopien des Vectors nach aussen gebe. it sollte meiner Recherche nach nicht invalidiert werden, da er immer vor der Stelle steht an der geloescht wird und jt wird ja direkt wieder auf einen gueltigen Punkt gesetzt.
Ich waere ueber Ideen wie es zu diesem Fehler kommen kann sehr dankbar.