<?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[Aller Dreier aus vector&amp;lt;int&amp;gt; löschen?]]></title><description><![CDATA[<p>hab ein ganz einfaches Problem. Wie kann ich alle Dreier aus einem vector&lt;int&gt; löschen?:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;vector&gt;
#include &lt;ctime&gt;
using namespace std;

int main()
{
	// Zufallsfunktion initialisieren
	srand(time(0));

	// Zufällig irgendwelche Zahlen ermitteln
	vector&lt;int&gt; Zahlen;
	for(int i = 0; i &lt; 10; i++)
		Zahlen.push_back(rand()%5+1);

	// Zahlen ausgeben
	for(unsigned int i = 0; i &lt; Zahlen.size(); i++)
		cout&lt;&lt;Zahlen[i]&lt;&lt;endl;

	cout&lt;&lt;&quot;&lt;===================================&quot;&lt;&lt;endl;

	// aller Dreier löschen
	vector&lt;int&gt; tmp;
	for(unsigned int i = 0; i &lt; Zahlen.size(); i++)
	{
		if(Zahlen[i] != 3)
			tmp.push_back(Zahlen[i]);
	}
	Zahlen = tmp;

	// Zahlen ausgeben
	for(unsigned int i = 0; i &lt; Zahlen.size(); i++)
		cout&lt;&lt;Zahlen[i]&lt;&lt;endl;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/145512/aller-dreier-aus-vector-lt-int-gt-löschen</link><generator>RSS for Node</generator><lastBuildDate>Thu, 03 Sep 2026 07:14:25 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/145512.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 28 Apr 2006 17:04:53 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Aller Dreier aus vector&amp;lt;int&amp;gt; löschen? on Fri, 28 Apr 2006 17:04:53 GMT]]></title><description><![CDATA[<p>hab ein ganz einfaches Problem. Wie kann ich alle Dreier aus einem vector&lt;int&gt; löschen?:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;vector&gt;
#include &lt;ctime&gt;
using namespace std;

int main()
{
	// Zufallsfunktion initialisieren
	srand(time(0));

	// Zufällig irgendwelche Zahlen ermitteln
	vector&lt;int&gt; Zahlen;
	for(int i = 0; i &lt; 10; i++)
		Zahlen.push_back(rand()%5+1);

	// Zahlen ausgeben
	for(unsigned int i = 0; i &lt; Zahlen.size(); i++)
		cout&lt;&lt;Zahlen[i]&lt;&lt;endl;

	cout&lt;&lt;&quot;&lt;===================================&quot;&lt;&lt;endl;

	// aller Dreier löschen
	vector&lt;int&gt; tmp;
	for(unsigned int i = 0; i &lt; Zahlen.size(); i++)
	{
		if(Zahlen[i] != 3)
			tmp.push_back(Zahlen[i]);
	}
	Zahlen = tmp;

	// Zahlen ausgeben
	for(unsigned int i = 0; i &lt; Zahlen.size(); i++)
		cout&lt;&lt;Zahlen[i]&lt;&lt;endl;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1047216</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1047216</guid><dc:creator><![CDATA[Vertexwahn]]></dc:creator><pubDate>Fri, 28 Apr 2006 17:04:53 GMT</pubDate></item><item><title><![CDATA[Reply to Aller Dreier aus vector&amp;lt;int&amp;gt; löschen? on Fri, 28 Apr 2006 17:17:53 GMT]]></title><description><![CDATA[<p>Mit std::remove_if und std::equal.<br />
Edit: Das Ding heißt equal_to, Beispiel siehe hier: <a href="http://www.sgi.com/tech/stl/remove_if.html" rel="nofollow">http://www.sgi.com/tech/stl/remove_if.html</a></p>
<p>Gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1047219</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1047219</guid><dc:creator><![CDATA[FireFlow]]></dc:creator><pubDate>Fri, 28 Apr 2006 17:17:53 GMT</pubDate></item><item><title><![CDATA[Reply to Aller Dreier aus vector&amp;lt;int&amp;gt; löschen? on Fri, 28 Apr 2006 17:20:05 GMT]]></title><description><![CDATA[<p>Danke für die Hilfe wärs mir gleich ansehen</p>
<p>Hab den Code etwas abgeändert - wie macht man das mit iteratorn - ich werde zwar die stl Algorithmen später verwenden, aber um etwas den Umgang mit iteratoren zu lernen wäre es interessant zu wissen wie man das Problem mit Iteratoren löst...</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;vector&gt;
#include &lt;ctime&gt;
#include &lt;algorithm&gt;
using namespace std;

int main()
{
	// Zufallsfunktion initialisieren
	srand(time(0));

	// Zufällig irgendwelche Zahlen ermitteln
	vector&lt;int&gt; Zahlen;
	for(int i = 0; i &lt; 10; i++)
		Zahlen.push_back(rand()%5+1);

	// Zahlen ausgeben
	for(unsigned int i = 0; i &lt; Zahlen.size(); i++)
		cout&lt;&lt;Zahlen[i]&lt;&lt;endl;

	cout&lt;&lt;&quot;&lt;===================================&quot;&lt;&lt;endl;

	// aller Dreier löschen
	unsigned index = 0;
	while(index != Zahlen.size())
	{
		if(Zahlen[index] == 3)
		{
			vector&lt;int&gt;::iterator dummy = Zahlen.begin() + index;
			Zahlen.erase(dummy);
		}
		else
		{
			index++;
		}
	}

	// Zahlen ausgeben
	for(unsigned int i = 0; i &lt; Zahlen.size(); i++)
		cout&lt;&lt;Zahlen[i]&lt;&lt;endl;

	cin.get();
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1047236</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1047236</guid><dc:creator><![CDATA[Vertexwahn]]></dc:creator><pubDate>Fri, 28 Apr 2006 17:20:05 GMT</pubDate></item><item><title><![CDATA[Reply to Aller Dreier aus vector&amp;lt;int&amp;gt; löschen? on Fri, 28 Apr 2006 17:25:48 GMT]]></title><description><![CDATA[<p>ja, fast... beim vector is das löschen mit iteratoren noch relativ leicht, bei listen hab ichs auch noch nicht richtig hinbekommen</p>
<pre><code class="language-cpp">for(int i = 0; i  &lt; v.size(); i++)
{
  if(v[i] == 3)
  {
    v.erase(v.begin()+i);
    i--;
  }
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1047245</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1047245</guid><dc:creator><![CDATA[Maxi]]></dc:creator><pubDate>Fri, 28 Apr 2006 17:25:48 GMT</pubDate></item><item><title><![CDATA[Reply to Aller Dreier aus vector&amp;lt;int&amp;gt; löschen? on Fri, 28 Apr 2006 17:27:25 GMT]]></title><description><![CDATA[<p>Maxi schrieb:</p>
<blockquote>
<p>ja, fast... beim vector is das löschen mit iteratoren noch relativ leicht, bei listen hab ichs auch noch nicht richtig hinbekommen</p>
</blockquote>
<p><a href="http://www.c-plusplus.net/forum/viewtopic-var-t-is-144602-and-highlight-is-.html" rel="nofollow">http://www.c-plusplus.net/forum/viewtopic-var-t-is-144602-and-highlight-is-.html</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1047249</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1047249</guid><dc:creator><![CDATA[GPC]]></dc:creator><pubDate>Fri, 28 Apr 2006 17:27:25 GMT</pubDate></item><item><title><![CDATA[Reply to Aller Dreier aus vector&amp;lt;int&amp;gt; löschen? on Fri, 28 Apr 2006 17:33:01 GMT]]></title><description><![CDATA[<p>Du solltest zuerst Zahlen.reserve(10) aufrufen, sonst muss während der Schleife eventuell mehrmals neu allokiert werden.</p>
<p>Das Problem an der Sache bei std::vector ist, dass alle Iteratoren ungültig werden (können) wenn du nur ein Elemnt löscht, daher macht das remove_if auch etwas anderst, kannst dir ja mal eine Implementierung davon anschauen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1047263</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1047263</guid><dc:creator><![CDATA[FireFlow]]></dc:creator><pubDate>Fri, 28 Apr 2006 17:33:01 GMT</pubDate></item><item><title><![CDATA[Reply to Aller Dreier aus vector&amp;lt;int&amp;gt; löschen? on Fri, 28 Apr 2006 17:34:48 GMT]]></title><description><![CDATA[<p>so gefällts mir schon gut <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;vector&gt;
#include &lt;ctime&gt;
#include &lt;functional&gt;
#include &lt;algorithm&gt;
using namespace std;

bool gleichDrei(int zahl)
{
	if(zahl == 3)
		return true;
	else
		return false;
}

int main()
{
	// Zufallsfunktion initialisieren
	srand(time(0));

	// Zufällig irgendwelche Zahlen ermitteln
	vector&lt;int&gt; Zahlen;
	for(int i = 0; i &lt; 10; i++)
		Zahlen.push_back(rand()%5+1);

	// Zahlen ausgeben
	for(unsigned int i = 0; i &lt; Zahlen.size(); i++)
		cout&lt;&lt;Zahlen[i]&lt;&lt;endl;

	cout&lt;&lt;&quot;&lt;===================================&quot;&lt;&lt;endl;

	// aller Dreier löschen
    remove_if(Zahlen.begin(), Zahlen.end(), gleichDrei);

	// Zahlen ausgeben
	for(unsigned int i = 0; i &lt; Zahlen.size(); i++)
		cout&lt;&lt;Zahlen[i]&lt;&lt;endl;

	//cin.get();
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1047266</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1047266</guid><dc:creator><![CDATA[Vertexwahn]]></dc:creator><pubDate>Fri, 28 Apr 2006 17:34:48 GMT</pubDate></item><item><title><![CDATA[Reply to Aller Dreier aus vector&amp;lt;int&amp;gt; löschen? on Fri, 28 Apr 2006 17:52:15 GMT]]></title><description><![CDATA[<p>wieso werden hier die Dreier nicht gelöscht?</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;vector&gt;
#include &lt;ctime&gt;
#include &lt;functional&gt;
#include &lt;algorithm&gt;
using namespace std;

int main()
{
	// Zufallsfunktion initialisieren
	srand(time(0));

	// Zufällig irgendwelche Zahlen ermitteln
	vector&lt;int&gt; Zahlen;
	for(int i = 0; i &lt; 10; i++)
		Zahlen.push_back(3/*rand()%5+1*/);

	// Zahlen ausgeben
	for(unsigned int i = 0; i &lt; Zahlen.size(); i++)
		cout&lt;&lt;Zahlen[i]&lt;&lt;endl;

	cout&lt;&lt;&quot;&lt;===================================&quot;&lt;&lt;endl;

	// aller Dreier löschen
    remove_if(Zahlen.begin(), Zahlen.end(), 
		bind2nd(equal_to&lt;int&gt;(), 3)
	);

	// Zahlen ausgeben
	for(unsigned int i = 0; i &lt; Zahlen.size(); i++)
		cout&lt;&lt;Zahlen[i]&lt;&lt;endl;

	cin.get();
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1047281</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1047281</guid><dc:creator><![CDATA[Vertexwahn]]></dc:creator><pubDate>Fri, 28 Apr 2006 17:52:15 GMT</pubDate></item><item><title><![CDATA[Reply to Aller Dreier aus vector&amp;lt;int&amp;gt; löschen? on Fri, 28 Apr 2006 18:13:45 GMT]]></title><description><![CDATA[<p>Sieh dir nochmal den Post von FireFlow an. remove_if löscht gar nichts <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<p>Wir wollens nicht unnötig in die Länge ziehen: remove_if kopiert die Elemente die gelöscht werden sollen an das Ende der Liste und gibt dir einen Iterator zurück um *ab zurückgegebenen Iterator* zu löschen:</p>
<pre><code class="language-cpp">vector&lt;int&gt;::iterator remove_from = remove_if(Zahlen.begin(), Zahlen.end(), 
        bind2nd(equal_to&lt;int&gt;(), 3) 
    ); 

	Zahlen.erase(remove_from,Zahlen.end());
</code></pre>
<p>MfG SideWinder</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1047300</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1047300</guid><dc:creator><![CDATA[SideWinder]]></dc:creator><pubDate>Fri, 28 Apr 2006 18:13:45 GMT</pubDate></item><item><title><![CDATA[Reply to Aller Dreier aus vector&amp;lt;int&amp;gt; löschen? on Fri, 28 Apr 2006 18:38:25 GMT]]></title><description><![CDATA[<blockquote>
<p>remove_if kopiert die Elemente die gelöscht werden sollen an das Ende der Liste und gibt dir einen Iterator zurück</p>
</blockquote>
<p>danke für die Hilfe! der Code funktioniert:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;vector&gt;
#include &lt;ctime&gt;
#include &lt;functional&gt;
#include &lt;algorithm&gt;
using namespace std;

int main()
{
	// Zufallsfunktion initialisieren
	srand(time(0));

	// Zufällig irgendwelche Zahlen ermitteln
	vector&lt;int&gt; Zahlen;
	for(int i = 0; i &lt; 10; i++)
		Zahlen.push_back(rand()%5+1);

	// Zahlen ausgeben
	for(unsigned i = 0; i &lt; Zahlen.size(); i++)
		cout&lt;&lt;Zahlen[i]&lt;&lt;endl;

	cout&lt;&lt;&quot;&lt;===================================&quot;&lt;&lt;endl;

	// aller Dreier löschen
    vector&lt;int&gt;::iterator remove_from = remove_if(Zahlen.begin(), Zahlen.end(),
        bind2nd(equal_to&lt;int&gt;(), 3)
    );

    Zahlen.erase(remove_from,Zahlen.end());

	// Zahlen ausgeben
	for(unsigned i = 0; i &lt; Zahlen.size(); i++)
		cout&lt;&lt;Zahlen[i]&lt;&lt;endl;

	cin.get();
}
</code></pre>
<p>was ich aber nicht verstehe ist - wenn ich das erease weglassen, dann ist die Zahlenliste bei der 2ten ausgabe nicht verändert:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;vector&gt;
#include &lt;ctime&gt;
#include &lt;functional&gt;
#include &lt;algorithm&gt;
using namespace std;

int main()
{
	// Zufallsfunktion initialisieren
	srand(time(0));

	// Zufällig irgendwelche Zahlen ermitteln
	vector&lt;int&gt; Zahlen;
	for(int i = 0; i &lt; 10; i++)
		Zahlen.push_back(rand()%5+1);

	// Zahlen ausgeben
	for(unsigned i = 0; i &lt; Zahlen.size(); i++)
		cout&lt;&lt;Zahlen[i]&lt;&lt;endl;

	cout&lt;&lt;&quot;&lt;===================================&quot;&lt;&lt;endl;

	// aller Dreier löschen 
    vector&lt;int&gt;::iterator remove_from = remove_if(Zahlen.begin(), Zahlen.end(),
        bind2nd(equal_to&lt;int&gt;(), 3)
    );

    //Zahlen.erase(remove_from,Zahlen.end()); // &lt;- wird jetzt weggelassen

	// Zahlen ausgeben  // 2te Ausgabe
	for(unsigned i = 0; i &lt; Zahlen.size(); i++)
		cout&lt;&lt;Zahlen[i]&lt;&lt;endl;

	cin.get();
}
</code></pre>
<p>meiner Erwartung nach müssten doch bei der 2ten Ausgabe die Dreier hinten stehen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1047317</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1047317</guid><dc:creator><![CDATA[Vertexwahn]]></dc:creator><pubDate>Fri, 28 Apr 2006 18:38:25 GMT</pubDate></item><item><title><![CDATA[Reply to Aller Dreier aus vector&amp;lt;int&amp;gt; löschen? on Fri, 28 Apr 2006 18:44:21 GMT]]></title><description><![CDATA[<p>Naja das mit den &quot;die Dreier stehen hinten&quot; scheint nicht ganz zu stimmen. Beim Löschen scheint er alle Elemente die nicht dazugehören durch das nachfolgende Element zu ersetzen. Am Ende bleiben dann die bisher am Ende stehenden Zahlen einfach übrig (sie wurden eh nach vorne kopiert).</p>
<p>Der geht von deinem erase() aus <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
<p>MfG SideWinder</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1047322</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1047322</guid><dc:creator><![CDATA[SideWinder]]></dc:creator><pubDate>Fri, 28 Apr 2006 18:44:21 GMT</pubDate></item><item><title><![CDATA[Reply to Aller Dreier aus vector&amp;lt;int&amp;gt; löschen? on Fri, 28 Apr 2006 18:46:52 GMT]]></title><description><![CDATA[<p>Vertexwahn schrieb:</p>
<blockquote>
<p>meiner Erwartung nach müssten doch bei der 2ten Ausgabe die Dreier hinten stehen?</p>
</blockquote>
<p>Ne das mit dem Kopieren von Sidewinder muss nicht stimmen, das ist implementierungsbedingt was an den letzten Stellen dann steht. Aber normalerweise bleibt da einfach das stehen was vorher auch da war, eine 3 dort hinzuschreiben ist ja unnötig.</p>
<p>edit: Das hat man davon wenn man erst noch die Musik anmacht bevor man postet ~~</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1047323</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1047323</guid><dc:creator><![CDATA[FireFlow]]></dc:creator><pubDate>Fri, 28 Apr 2006 18:46:52 GMT</pubDate></item><item><title><![CDATA[Reply to Aller Dreier aus vector&amp;lt;int&amp;gt; löschen? on Fri, 28 Apr 2006 20:13:55 GMT]]></title><description><![CDATA[<p>Maxi schrieb:</p>
<blockquote>
<p>ja, fast... beim vector is das löschen mit iteratoren noch relativ leicht, bei listen hab ichs auch noch nicht richtig hinbekommen</p>
<pre><code class="language-cpp">for(int i = 0; i  &lt; v.size(); i++)
{
  if(v[i] == 3)
  {
    v.erase(v.begin()+i);
    i--;
  }
}
</code></pre>
</blockquote>
<p>sowas sollte man nie tun. Nicht nur weil es das std::remove_if gibt, sondern auch weil man bei einer Anwendung dieses Algorithmus' auf z.B. diesen Vector</p>
<pre><code class="language-cpp">using namespace std;
    vector&lt; int &gt; v( 99999, 3 );
    v[8] = 7;
</code></pre>
<p>sein blaues Wunder erleben kann <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1047361</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1047361</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Fri, 28 Apr 2006 20:13:55 GMT</pubDate></item><item><title><![CDATA[Reply to Aller Dreier aus vector&amp;lt;int&amp;gt; löschen? on Fri, 28 Apr 2006 20:19:45 GMT]]></title><description><![CDATA[<p>warum erlebt man dabei sein blaues wunder?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1047365</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1047365</guid><dc:creator><![CDATA[Maxi_loggedout]]></dc:creator><pubDate>Fri, 28 Apr 2006 20:19:45 GMT</pubDate></item><item><title><![CDATA[Reply to Aller Dreier aus vector&amp;lt;int&amp;gt; löschen? on Fri, 28 Apr 2006 20:24:05 GMT]]></title><description><![CDATA[<p>Maxi_loggedout schrieb:</p>
<blockquote>
<p>warum erlebt man dabei sein blaues wunder?</p>
</blockquote>
<p>probier's aus <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
<p>und danach dann den gleichen vector noch mal mit</p>
<pre><code class="language-cpp">v.erase( remove_if( v.begin(), v.end(), bind2nd( equal_to&lt; int &gt;(), 3 ) ), v.end() );
</code></pre>
<p>dann merkst Du's deutlich</p>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1047371</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1047371</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Fri, 28 Apr 2006 20:24:05 GMT</pubDate></item><item><title><![CDATA[Reply to Aller Dreier aus vector&amp;lt;int&amp;gt; löschen? on Fri, 28 Apr 2006 20:42:28 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">class Edge
		{
		public:
	               ...

		private:
			int    x_min; 
			int    y_min; 	   
			float    x;	   
			float   reciprocalSlope; 				 
			int  	y_max; 

		}; // class Edge

class Polygon
{
...
			bool compareYmax(Edge edge)
			{
				if(scanline == edge.y_max)
					return true;
				else
					false;
			}
...
{
...
// Alle Kanten in der Active Edge Table für die gilt y (scanline) == ymax werden entfernt
vector&lt;Edge&gt;::iterator remove_from = remove_if(ActiveEdgeTable.begin(),
       					  ActiveEdgeTable.end(),
					  compareYmax);  // &lt;- ursache des fehlers

					ActiveEdgeTable.erase(remove_from,ActiveEdgeTable.end());
}
...
}; // class Polygon
</code></pre>
<p>der Compiler gibt mir die Fehlermeldung &quot;c:\scanline.h(178) : error C3867: 'Polygon::compareYmax': function call missing argument list; use '&amp;Vertexwahn::Scanline::Polygon::compareYmax' to create a pointer to member<br />
&quot;</p>
<p>warum geht das nicht? ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1047381</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1047381</guid><dc:creator><![CDATA[Vertexwahn]]></dc:creator><pubDate>Fri, 28 Apr 2006 20:42:28 GMT</pubDate></item><item><title><![CDATA[Reply to Aller Dreier aus vector&amp;lt;int&amp;gt; löschen? on Fri, 28 Apr 2006 21:01:11 GMT]]></title><description><![CDATA[<p>Vertexwahn schrieb:</p>
<blockquote>
<pre><code class="language-cpp">// Alle Kanten in der Active Edge Table für die gilt y (scanline) == ymax werden entfernt
vector&lt;Edge&gt;::iterator remove_from = remove_if(ActiveEdgeTable.begin(),
       					  ActiveEdgeTable.end(),
					  compareYmax);  // &lt;- ursache des fehlers

					ActiveEdgeTable.erase(remove_from,ActiveEdgeTable.end());
</code></pre>
<p>der Compiler gibt mir die Fehlermeldung &quot;c:\scanline.h(178) : error C3867: 'Polygon::compareYmax': function call missing argument list; use '&amp;Vertexwahn::Scanline::Polygon::compareYmax' to create a pointer to member<br />
&quot;</p>
<p>warum geht das nicht? ...</p>
</blockquote>
<p>weil 'compareYmax' kein Funktor oder eine Funktion, sondern eine Methode ist. Korrekt wäre</p>
<pre><code class="language-cpp">Polygon poly;
    vector&lt;Edge&gt;::iterator remove_from = remove_if(ActiveEdgeTable.begin(),
        ActiveEdgeTable.end(),
        bind1st( mem_fun( &amp;Polygon::compareYmax ), &amp;poly ) );
</code></pre>
<p>oder mit boost</p>
<pre><code class="language-cpp">vector&lt;Edge&gt;::iterator remove_from = remove_if(ActiveEdgeTable.begin(),
        ActiveEdgeTable.end(),
        boost::bind( &amp;Polygon::compareYmax, p, _1 ) );
</code></pre>
<p>was ist übrigens 'scanline'; mir scheint dass die Methode compareYmax gar keine Member von Polygon benötigt; dann bräuchtest Du sie auch nicht.</p>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1047392</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1047392</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Fri, 28 Apr 2006 21:01:11 GMT</pubDate></item><item><title><![CDATA[Reply to Aller Dreier aus vector&amp;lt;int&amp;gt; löschen? on Fri, 28 Apr 2006 22:03:35 GMT]]></title><description><![CDATA[<p>eigentlich hätte ich gerne so etwas:</p>
<pre><code class="language-cpp">vector&lt;Edge&gt;::iterator remove_from = remove_if(ActiveEdgeTable.begin(), 
	   ActiveEdgeTable.end(),  mem_func&lt;bool,Edge&gt;(&amp;Polygon::compareYmax));
</code></pre>
<p>hier der ganze code:</p>
<pre><code class="language-cpp">#ifndef Scanline_h
#define Scanline_h

#include &lt;vector&gt;
#include &lt;algorithm&gt;
#include &lt;cassert&gt;
#include &lt;functional&gt;
using namespace std;

namespace Vertexwahn
{
	namespace Scanline	
	{
		class Plane3D // Repräsentierte eine Ebene
		{
		public:
			float A,B,C,D;
		}; // class Plane

		class Edge	// Kante eines Polygons. 
			        // Festlegung: Die Eckpunkte einer Kante sind immer ganzzahlig, liegen also genau auf einen Pixel
		{
		public:
			Edge(int x1, int y1, int x2, int y2)
			{
				x_min = x1 &gt; x2 ? x2 : x1;

				y_min = y1 &gt; y2 ? y2 : y1;
				x     = y1 &gt; y2 ? x2 : x1;

				if(y2 == y1)	// bei vertikalen Kannten wird die Steigung auf 0 gesetzt
					reciprocalSlope = 0;
				else
					reciprocalSlope = (x2-x1) / (y2-y1);

				y_max = y1 &gt; y2 ? y1 : y2;

				color = 0xFFFF0000; // rot
			}

			void print()
			{
				cout&lt;&lt;&quot;========================================&quot;&lt;&lt;endl;
				cout&lt;&lt;&quot;y_min          : &quot;&lt;&lt;y_min&lt;&lt;endl;
				cout&lt;&lt;&quot;x              : &quot;&lt;&lt;x&lt;&lt;endl;
				cout&lt;&lt;&quot;reciprocalSlope: &quot;&lt;&lt;reciprocalSlope&lt;&lt;endl;
				cout&lt;&lt;&quot;y_max          : &quot;&lt;&lt;y_max&lt;&lt;endl;
			}

			// zum Sortieren der Kanten nach dem kleinsten y-Wert - das &quot;kleinste&quot; Element ist ganz hinten 
			// im Array zu finden
			bool operator&lt;(const Edge &amp;rhs)
			{
			/*  // alter Code: hier war das kleinste Elment ganz vorn im Array zu finden
			    // wurde aber umgedreht, weil dadurch der Code in der draw Methode einfacher wird
				if(y_min == rhs.y_min)	// haben zwei Kanten den gleichen minimalen y-Wert, so werden sie nach 
				{   
					// aufsteigendem x-Wert sortiert
					return x_min &lt; rhs.x_min;
				}
				else
					return y_min &lt; rhs.y_min;
			*/

				if(y_min == rhs.y_min)	// haben zwei Kanten den gleichen minimalen y-Wert, so werden sie nach 
				{   
					// aufsteigendem x-Wert sortiert
					return x_min &gt; rhs.x_min;
				}
				else
					return y_min &gt; rhs.y_min;
			}

			Edge(const Edge &amp;edge)
			{
				x_min = edge.x_min;
				y_min = edge.y_min;
				x = edge.x;
				reciprocalSlope = edge.reciprocalSlope;
				y_max = edge.y_max;
				color = edge.color;
			}

			Edge&amp; operator=(const Edge &amp;edge)
			{
				x_min = edge.x_min;
				y_min = edge.y_min;
				x = edge.x;
				reciprocalSlope = edge.reciprocalSlope;
				y_max = edge.y_max;
				color = edge.color;

				return *this;
			}

			int getYMax()
			{
				return y_max;
			}

		private:

			int    x_min; // kleinster x-Wert der Kante, wird zum Soriteren der GlobalEdgeTable benötigt

			int    y_min; // kleinster y-Wert der Kante - damit man bestimmen kann wann eine Kante in die 
						   // Active Edge List aufgenommen werden soll
			float    x;	   // Die x-Koordinate des Kantenpunkts mit der kleineren y-Koordinate

			float   reciprocalSlope; // Kehrwert der Steigung (1/slope) zur Berechnung von Schittpunkten mit der Scanline
									 // Für vertikale Kanten wird der Wert 0 angenommen.

			int  	y_max; // größter y-Wert der Kante - damit man bestimmen kann wan die Kante aus der Global bzw. Active
						   // Edge Table gelöscht werden kann

			int		color;	// Farbe des Polygons
			//Plane3D planeequation; // Ebenengleichung zur Bestimmung der Tiefe (für den Z-Buffer)

			friend class Polygon; // die Klasse Polygon soll auf private Datenelmente der Kanten zugreifen dürfen
		}; // class Edge

		//  Verwendetes Koordinatensystem
		//   y+
		//   |
		//   |
		//   | ========  Scanline wird von unten nach oben über das Polygon geschoben
		//   |
		//   0-------x+
		class Polygon
		{
		public:

			void setPixelColor(int x, int y, int color)
			{
			}

			bool compareYmax(Edge edge)
			{
				return scanline == edge.y_max;
			}

			// Methode sollte erste Aufgerufen werden, wenn die GlobalEdgeTable Kanten eines gülitgen Polygons 
			// enthält
			void draw()
			{
				// Polygon soll von unten nach oben gerendert werden - also vom minimalen y-Wert bis maximalen y-Wert

				// ist die GlobalEdgeTable nach y_min sortiert so muss man nur den minimalen y-Wert der ersten Kante
				// ermitteln und erhält so den minimalen y-Wert der Kante. Der Algorithmus wird abgebrochen, wenn
				// die GlobalEdgeTable und die ActiveEdgeTable leer ist. Damit wird der maximale y-Wert des Polygons
				// nicht benötigt.

				// GlobalEdgeTabel sortieren
				sort(GlobalEdgeTable.begin(), GlobalEdgeTable.end());

				// Startwert für die Scanline ist die minimale y-Koordinate des Polygons
				scanline = GlobalEdgeTable.back().y_min;

				// AET cleanen ;)
				ActiveEdgeTable.clear();

				// Solange die ActiveEdgeTable und die GlobalEdgeTable nicht leer sind
				while(!(GlobalEdgeTable.empty() &amp;&amp; ActiveEdgeTable.empty()))
				{
					// Alle Kanten werden zur ActiveEdgeTable hinzugefügt und aus der 
					// Global Edgetable entfernt deren minimaler y-Wert mit der Scanline übereinstimmt
					while(!GlobalEdgeTable.empty() &amp;&amp; (GlobalEdgeTable.back().y_min == scanline))
					{
						ActiveEdgeTable.push_back(GlobalEdgeTable.back());
						GlobalEdgeTable.pop_back();
					}	

					// Pixel zwischen jeweils zwei Schnittpunkten der AET malen
					Fill();

					// Alle Kanten in der Active Edge Table für die gilt y (scanline) == ymax werden entfernt
					vector&lt;Edge&gt;::iterator remove_from = remove_if(ActiveEdgeTable.begin(), 
																   ActiveEdgeTable.end(), 
																   mem_func&lt;bool,Edge&gt;(&amp;Polygon::compareYmax)); 

					ActiveEdgeTable.erase(remove_from,ActiveEdgeTable.end());

					// continue...

					print();
					int a;
					a++;

				}

				// für die Scanline machen nur ganzzahlige werte sinn... ??? wenn start_y z.B.  2.9 ist wo mit scanline beginnen?
				// 
			}

			// Erwartet das die ActiveEdgeTable sortiert ist nach dem x-Wert und dieser zugleich
			// den Schnittpunkt mit Scanline darstellt
			void Fill()
			{
				// in der Active EdgeTable befindet sich immer eine gerade Anzahl von 
				// Kanten 
				assert(ActiveEdgeTable.size() % 2 == 0);

				for(int i = 0; i &lt; ActiveEdgeTable.size()-1; i++)
				{
					assert(ActiveEdgeTable[i].x &lt; ActiveEdgeTable[i+1].x);
				}

				// Fill Conventions:
				// siehe &quot;Problem beim Füllen von Pixel zwischen zwei Schnittpunkten&quot;
				// an diese Fill Conentions halte ich mich noch nicht - diese Methode sollte jedoch halbwegs zufrieden
				// stellende Ergebnisse liefern - für die Zukunft: Nur linke und untere Ränder zeichnen
				// obere und rechte Ränder werden nicht gezeichnet

				for(int i = 0; i &lt; ActiveEdgeTable.size() / 2; i++)
				{
					DrawHorizontalLine(ActiveEdgeTable[i*2].x,ActiveEdgeTable[i*2+1].x);
				}
			}

			void DrawHorizontalLine(int a, int b)
			{
				assert(a &gt; 0);
				assert(b &gt; 0);
				assert(a &lt; 400);
				assert(b &lt; 400);
			}

			void print()
			{
				sort(GlobalEdgeTable.begin(), GlobalEdgeTable.end());

				// GlobalEdgeTable
				cout&lt;&lt;&quot;GlobalEdgeTable&quot;&lt;&lt;endl;
				for(int i = 0; i &lt; GlobalEdgeTable.size(); i++)
					GlobalEdgeTable[i].print();
				cout&lt;&lt;&quot;ActiveEdgeTable&quot;&lt;&lt;endl;
				for(int i = 0; i &lt; ActiveEdgeTable.size(); i++)
					ActiveEdgeTable[i].print();
			}

			void add(int x1, int y1, int x2, int y2)
			{
				// Horizontale Kanten ignorieren
				if(y1==y2)
					return;

				GlobalEdgeTable.push_back(Edge(x1,y1,x2,y2));
			}
		private:

			vector&lt;Edge&gt; GlobalEdgeTable; // Kantenliste soritiert nach minimalen y-Wert enthalt nur Kanten, die 
			                              // nicht horizontal sind - Kanten werden entfernt, wenn sie in die Active
										  // Edge List übernommen werden

			vector&lt;Edge&gt; ActiveEdgeTable; // Alle Kanten, die die Scanline aktuell schneiden tut ;)

			float scanline;				// y-Koordinaten der Scanline  
		}; // class Polygon

	} // namespace Scanline
} // namespace Vertexwahn

#endif
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1047424</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1047424</guid><dc:creator><![CDATA[Vertexwahn]]></dc:creator><pubDate>Fri, 28 Apr 2006 22:03:35 GMT</pubDate></item></channel></rss>