<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Speicherzugriffsfehler durch set_intersection]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich habe ein Speicherzugriffsfehler durch set_intersection, weiss aber nicht so recht, woran es liegt.</p>
<p>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:</p>
<p>set_intersection(v.begin(),v.end(),w.begin(),w.end(),itResult);</p>
<p>Wobei itResult ein Zeiger auf result.begin() ist. Ist dieser Aufruf so richtig?</p>
<p>Lasse ich den Aufruf weg so läuft mein Programm normal durch.</p>
<pre><code>//Enthalten Strings
infoExtraction = n[3];
infoDefault = n[18];

//Umwandlung in Kleinschreibung fuer leichteren Vergleich
for(unsigned int i = 0; i &lt; infoExtraction.size(); ++i)
	        		infoExtraction[i] = tolower(infoExtraction[i]);

//Umwandlung in Kleinschreibung fuer leichteren Vergleich
for(unsigned int i = 0; i &lt; infoDefault.size(); ++i)
	        		infoDefault[i] = tolower(infoDefault[i]);

 if((infoExtraction != infoDefault) &amp;&amp; (infoDefault.empty() == false) &amp;&amp; (infoExtraction.empty() == false))
    {    		
		pos = infoExtraction.find(&quot; &quot;);
		if((pos == -1) &amp;&amp; (infoExtraction.empty() == false))
		{			 
			 v.push_back(infoExtraction);
		}

		while(pos &gt; -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) &amp;&amp; (temp.length() &gt; 1))
	    	{
	    			v.push_back(temp);
	    	}

	    	pos = infoExtraction.find(&quot; &quot;);

	    	/* 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) &amp;&amp; (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(&quot; &quot;);
		if((pos == -1) &amp;&amp; (infoDefault.empty() == false))
		{			 
			 w.push_back(infoDefault);
		}

		while(pos &gt; -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) &amp;&amp; (temp.length() &gt; 1))
	    	{
	    			w.push_back(temp);
	    	}

	    	pos = infoDefault.find(&quot; &quot;);

	    	/* 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) &amp;&amp; (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 &lt; v.end(); itV++)
		{
			cout &lt;&lt; &quot;v: &quot; &lt;&lt; *itV &lt;&lt; endl;	
		}

		for(itW = w.begin(); itW &lt; w.end(); itW++)
		{
			cout &lt;&lt; &quot;w: &quot; &lt;&lt; *itW &lt;&lt; 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)
    	{
    		...
    	}    	
    }
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/146603/speicherzugriffsfehler-durch-set_intersection</link><generator>RSS for Node</generator><lastBuildDate>Thu, 03 Sep 2026 17:37:54 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/146603.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 09 May 2006 10:09:19 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Speicherzugriffsfehler durch set_intersection on Tue, 09 May 2006 10:09:19 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich habe ein Speicherzugriffsfehler durch set_intersection, weiss aber nicht so recht, woran es liegt.</p>
<p>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:</p>
<p>set_intersection(v.begin(),v.end(),w.begin(),w.end(),itResult);</p>
<p>Wobei itResult ein Zeiger auf result.begin() ist. Ist dieser Aufruf so richtig?</p>
<p>Lasse ich den Aufruf weg so läuft mein Programm normal durch.</p>
<pre><code>//Enthalten Strings
infoExtraction = n[3];
infoDefault = n[18];

//Umwandlung in Kleinschreibung fuer leichteren Vergleich
for(unsigned int i = 0; i &lt; infoExtraction.size(); ++i)
	        		infoExtraction[i] = tolower(infoExtraction[i]);

//Umwandlung in Kleinschreibung fuer leichteren Vergleich
for(unsigned int i = 0; i &lt; infoDefault.size(); ++i)
	        		infoDefault[i] = tolower(infoDefault[i]);

 if((infoExtraction != infoDefault) &amp;&amp; (infoDefault.empty() == false) &amp;&amp; (infoExtraction.empty() == false))
    {    		
		pos = infoExtraction.find(&quot; &quot;);
		if((pos == -1) &amp;&amp; (infoExtraction.empty() == false))
		{			 
			 v.push_back(infoExtraction);
		}

		while(pos &gt; -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) &amp;&amp; (temp.length() &gt; 1))
	    	{
	    			v.push_back(temp);
	    	}

	    	pos = infoExtraction.find(&quot; &quot;);

	    	/* 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) &amp;&amp; (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(&quot; &quot;);
		if((pos == -1) &amp;&amp; (infoDefault.empty() == false))
		{			 
			 w.push_back(infoDefault);
		}

		while(pos &gt; -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) &amp;&amp; (temp.length() &gt; 1))
	    	{
	    			w.push_back(temp);
	    	}

	    	pos = infoDefault.find(&quot; &quot;);

	    	/* 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) &amp;&amp; (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 &lt; v.end(); itV++)
		{
			cout &lt;&lt; &quot;v: &quot; &lt;&lt; *itV &lt;&lt; endl;	
		}

		for(itW = w.begin(); itW &lt; w.end(); itW++)
		{
			cout &lt;&lt; &quot;w: &quot; &lt;&lt; *itW &lt;&lt; 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)
    	{
    		...
    	}    	
    }
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1054000</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1054000</guid><dc:creator><![CDATA[Agamemnon]]></dc:creator><pubDate>Tue, 09 May 2006 10:09:19 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherzugriffsfehler durch set_intersection on Tue, 09 May 2006 10:19:54 GMT]]></title><description><![CDATA[<p>Ups, habs selber rausgefunden.</p>
<p>Der Aufruf war falsch. Nun läufts.</p>
<p>Richtiger Aufruf:<br />
set_intersection(v.begin(),v.end(),w.begin(),w.end(),inserter(result,result.begin()));</p>
<p>Trotzdem Danke</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1054009</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1054009</guid><dc:creator><![CDATA[Agamemnon]]></dc:creator><pubDate>Tue, 09 May 2006 10:19:54 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherzugriffsfehler durch set_intersection on Tue, 09 May 2006 10:23:09 GMT]]></title><description><![CDATA[<p>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 &quot;result.resize(min(v.size(),w.size()));&quot; - dann mußt du aber die Überprüfung anpassen) oder inserter verwenden:</p>
<pre><code class="language-cpp">set_intersection(v.begin(),v.end(),w.begin(),w.end(),back_inserter(result));
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1054011</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1054011</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Tue, 09 May 2006 10:23:09 GMT</pubDate></item></channel></rss>