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

Anmelden zum Antworten