Speicherzugriffsfehler durch set_intersection
-
Hallo zusammen,
ich habe ein Speicherzugriffsfehler durch set_intersection, weiss aber nicht so recht, woran es liegt.
In meinem Programm werden drei Vektoren verwendet v, w, result. v und w werden mit String-Objekten gefüllt (String besteht aus mehreren Wörtern). Mit set_intersection will ich dann die Schnittmenge von v und w bestimmen. Mein Aufruf für set_intersection lautet:
set_intersection(v.begin(),v.end(),w.begin(),w.end(),itResult);
Wobei itResult ein Zeiger auf result.begin() ist. Ist dieser Aufruf so richtig?
Lasse ich den Aufruf weg so läuft mein Programm normal durch.
//Enthalten Strings infoExtraction = n[3]; infoDefault = n[18]; //Umwandlung in Kleinschreibung fuer leichteren Vergleich for(unsigned int i = 0; i < infoExtraction.size(); ++i) infoExtraction[i] = tolower(infoExtraction[i]); //Umwandlung in Kleinschreibung fuer leichteren Vergleich for(unsigned int i = 0; i < infoDefault.size(); ++i) infoDefault[i] = tolower(infoDefault[i]); if((infoExtraction != infoDefault) && (infoDefault.empty() == false) && (infoExtraction.empty() == false)) { pos = infoExtraction.find(" "); if((pos == -1) && (infoExtraction.empty() == false)) { v.push_back(infoExtraction); } while(pos > -1) { temp = infoExtraction; temp.erase(pos); infoExtraction.erase(0,pos+1); //Ist Begriff nicht leer und hat eine Laenge groesser 1 wird er im Vektor eingefuegt if((temp.empty() == false) && (temp.length() > 1)) { v.push_back(temp); } pos = infoExtraction.find(" "); /* Wurde kein Blank gefunden, aber es ist noch eine Zeichenkette vorhanden, * so handelt es sich um das letzte Wort des Namens. Dieses wird auch in den * Vektor eingefuegt. */ if((pos == -1) && (infoExtraction.empty() == false)) { v.push_back(infoExtraction); } } //Der eben erstellte Vektor wird nun sortiert, um set_intersection anwenden zu koennen sort(v.begin(), v.end()); //Einfuegen der einzelnen Bestandteile in den Vektor pos = infoDefault.find(" "); if((pos == -1) && (infoDefault.empty() == false)) { w.push_back(infoDefault); } while(pos > -1) { temp = infoDefault; temp.erase(pos); infoDefault.erase(0,pos+1); //Ist Begriff nicht leer und hat eine Laenge groesser 1 wird er im Vektor eingefuegt if((temp.empty() == false) && (temp.length() > 1)) { w.push_back(temp); } pos = infoDefault.find(" "); /* Wurde kein Blank gefunden, aber es ist noch eine Zeichenkette vorhanden, * so handelt es sich um das letzte Wort des Namens. Dieses wird auch in den * Vektor eingefuegt. */ if((pos == -1) && (infoDefault.empty() == false)) { w.push_back(infoDefault); } } //Der eben erstellte Vektor wird nun sortiert, um set_intersection anwenden zu koennen sort(w.begin(), w.end()); for(itV = v.begin(); itV < v.end(); itV++) { cout << "v: " << *itV << endl; } for(itW = w.begin(); itW < w.end(); itW++) { cout << "w: " << *itW << endl; } //Nun wird die Schnittmenge der beiden Vektoren gebildet set_intersection(v.begin(),v.end(),w.begin(),w.end(),itResult); //Ist die Schnittmenge leer, so handelt es sich um verschiedene Mengen if(result.empty() == true) { ... } }
-
Ups, habs selber rausgefunden.
Der Aufruf war falsch. Nun läufts.
Richtiger Aufruf:
set_intersection(v.begin(),v.end(),w.begin(),w.end(),inserter(result,result.begin()));Trotzdem Danke
-
Algorithmen können keinen Speicher selber anfordern, sondern nutzen nur den, der vorher schon da war. Also mußt du entweder vor dem set_intersection()-Aufruf genug Platz bereitstellen (durch "result.resize(min(v.size(),w.size()));" - dann mußt du aber die Überprüfung anpassen) oder inserter verwenden:
set_intersection(v.begin(),v.end(),w.begin(),w.end(),back_inserter(result));