<?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[std::set]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe 2 kurze fragen zu std::set:</p>
<ol>
<li>
<p>Wird std::set immer nur über insert gefüllt und niemals zu begin gesagt wie groß die menge wird? Also sowas geht nicht oder? myset = new std::set&lt;int&gt;(5000) um speicher für 5000 elemente zu halten?</p>
</li>
<li>
<p>wie wird eine std::set die auf dem heap angelegt ist gelöscht? Über destructor? oder wird dieser automatisch aufgerufen? also ein eigenes delete [] set sozusagen muss nicht gemacht werden oder?</p>
</li>
</ol>
<p>Danke</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/244883/std-set</link><generator>RSS for Node</generator><lastBuildDate>Sat, 19 Sep 2026 02:11:04 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/244883.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 07 Jul 2009 09:20:38 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to std::set on Tue, 07 Jul 2009 09:20:38 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe 2 kurze fragen zu std::set:</p>
<ol>
<li>
<p>Wird std::set immer nur über insert gefüllt und niemals zu begin gesagt wie groß die menge wird? Also sowas geht nicht oder? myset = new std::set&lt;int&gt;(5000) um speicher für 5000 elemente zu halten?</p>
</li>
<li>
<p>wie wird eine std::set die auf dem heap angelegt ist gelöscht? Über destructor? oder wird dieser automatisch aufgerufen? also ein eigenes delete [] set sozusagen muss nicht gemacht werden oder?</p>
</li>
</ol>
<p>Danke</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1738387</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1738387</guid><dc:creator><![CDATA[testo]]></dc:creator><pubDate>Tue, 07 Jul 2009 09:20:38 GMT</pubDate></item><item><title><![CDATA[Reply to std::set on Tue, 07 Jul 2009 09:24:52 GMT]]></title><description><![CDATA[<p>testo schrieb:</p>
<blockquote>
<ol>
<li>Wird std::set immer nur über insert gefüllt und niemals zu begin gesagt wie groß die menge wird? Also sowas geht nicht oder? myset = new std::set&lt;int&gt;(5000) um speicher für 5000 elemente zu halten?</li>
</ol>
</blockquote>
<p>Nein, das macht bei assoziativen Containern aber auch nicht viel Sinn. Wieso eigentlich <code>new</code> ? Es scheint hier irgendwie Angewohnheit zu sein, selbst Container immer auf dem Heap zu erstellen...</p>
<p>testo schrieb:</p>
<blockquote>
<ol start="2">
<li>wie wird eine std::set die auf dem heap angelegt ist gelöscht? Über destructor? oder wird dieser automatisch aufgerufen? also ein eigenes delete [] set sozusagen muss nicht gemacht werden oder?</li>
</ol>
</blockquote>
<p>Doch, natürlich muss es wieder explizit freigegeben werden. Deshalb sollst du Container im Allgemeinen auch auf dem Stack anlegen. Ausserdem wäre das <code>delete</code> und nicht <code>delete[]</code> .</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1738388</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1738388</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Tue, 07 Jul 2009 09:24:52 GMT</pubDate></item><item><title><![CDATA[Reply to std::set on Tue, 07 Jul 2009 09:40:57 GMT]]></title><description><![CDATA[<p>ok danke.<br />
Noch eine Frage in der Zwischenzeit: wie kann ich denn bei einem folgenden code erzwingen dass ich die differenz zweier mengen (z.B. zweier std::sets) erreiche die aber unterschiedlich groß sind. Und ich will die gesamte std::set hernehmen. Doch ein</p>
<pre><code>it=set_difference (first, first.end(), second, second.end(), v.begin());
</code></pre>
<p>geht nicht weil ich keine iteratoren übergebe...</p>
<ol start="3">
<li></li>
</ol>
<pre><code>// set_difference example
#include &lt;iostream&gt;
#include &lt;algorithm&gt;
#include &lt;vector&gt;
using namespace std;

int main () {
  int first[] = {5,10,15,20,25};
  int second[] = {50,40,30,20,10};
  vector&lt;int&gt; v(10);                           // 0  0  0  0  0  0  0  0  0  0
  vector&lt;int&gt;::iterator it;

  sort (first,first+5);     //  5 10 15 20 25
  sort (second,second+5);   // 10 20 30 40 50

  it=set_difference (first, first+5, second, second+5, v.begin());
                                               // 5 15 25  0  0  0  0  0  0  0

  cout &lt;&lt; &quot;difference has &quot; &lt;&lt; int(it - v.begin()) &lt;&lt; &quot; elements.\n&quot;;

  return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1738409</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1738409</guid><dc:creator><![CDATA[testo]]></dc:creator><pubDate>Tue, 07 Jul 2009 09:40:57 GMT</pubDate></item><item><title><![CDATA[Reply to std::set on Tue, 07 Jul 2009 10:07:43 GMT]]></title><description><![CDATA[<p>Wie wär es mit so etwas wie:</p>
<pre><code>#include &lt;iostream&gt;
#include &lt;algorithm&gt;
#include &lt;vector&gt;

using namespace std;

int main () 
{
  int first[] = {5,10,15,20,25};
  int second[] = {50,40,30,20,10};
  set&lt;int&gt; s1(first, first + 5);
  set&lt;int&gt; s2(second, second + 5);

  vector&lt;int&gt; v1, v2;

  set_difference (s1.begin(), s1.end(), s2.begin(), s2.end(), back_inserter(v1));
  cout &lt;&lt; &quot;difference first - second has &quot; &lt;&lt; v1.size() &lt;&lt; &quot; elements: &quot;;
  copy(v1.begin(), v1.end(), ostream_iterator&lt;int&gt;(cout, &quot; &quot;));
  cout &lt;&lt; endl;

  set_difference (s2.begin(), s2.end(), s1.begin(), s1.end(), back_inserter(v2));
  cout &lt;&lt; &quot;difference second - first has &quot; &lt;&lt; v2.size() &lt;&lt; &quot; elements: &quot;;
  copy(v2.begin(), v2.end(), ostream_iterator&lt;int&gt;(cout, &quot; &quot;));
  cout &lt;&lt; endl;

}
</code></pre>
<p>Live zu erleben unter <a href="http://codepad.org/EAYp1IPS" rel="nofollow">http://codepad.org/EAYp1IPS</a></p>
<p>/Ergänzung:<br />
Willst Du alle Werte haben, die nicht in beiden Sets vorkommen, nimmst Du statt der zwei Vektoren halt nur einen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1738426</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1738426</guid><dc:creator><![CDATA[jencas]]></dc:creator><pubDate>Tue, 07 Jul 2009 10:07:43 GMT</pubDate></item><item><title><![CDATA[Reply to std::set on Tue, 07 Jul 2009 11:39:18 GMT]]></title><description><![CDATA[<p>danke - die idee passt.</p>
<p>Mir ist allerdings nicht klar warum ich das ergebnis nicht in ein std::set schreiben lässt. wohl wegen den iteratoren. aber das muss doch irgendwie gehen...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1738492</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1738492</guid><dc:creator><![CDATA[testo]]></dc:creator><pubDate>Tue, 07 Jul 2009 11:39:18 GMT</pubDate></item><item><title><![CDATA[Reply to std::set on Tue, 07 Jul 2009 12:02:35 GMT]]></title><description><![CDATA[<p>testo schrieb:</p>
<blockquote>
<p>Mir ist allerdings nicht klar warum ich das ergebnis nicht in ein std::set schreiben lässt.</p>
</blockquote>
<p>Weils für std::set keinen back_inserter geben kann - es gibt nämlich kein push_back(). Eine Alternative ist <a href="http://www.cplusplus.com/reference/std/iterator/inserter/" rel="nofollow">std::inserter</a>. Aufruf dann wie folgt:</p>
<pre><code class="language-cpp">/* ... */

std::set&lt;int&gt; s3;

set_difference (s1.begin(), s1.end(), s2.begin(), s2.end(), std::inserter(s3, s3.end()));
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1738516</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1738516</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Tue, 07 Jul 2009 12:02:35 GMT</pubDate></item><item><title><![CDATA[Reply to std::set on Tue, 07 Jul 2009 12:08:53 GMT]]></title><description><![CDATA[<p>oder ich hab ne andere frage:</p>
<p>ich würde gerne die idee mit dem set_difference auf 2 int-heap-arrays anwenden...und das ergebnis in ein int-heap-array kopieren. ginge das?</p>
<p>mit dem folgenden geht das aber net:</p>
<pre><code>#include &lt;iostream&gt;
#include &lt;algorithm&gt;
#include &lt;vector&gt;
#include &lt;set&gt;
#include &lt;iterator&gt;

using namespace std;

int main ()
{
  int* first = new int[6];
  first[0] = 5;
  first[1] = 10;
  first[2] = 15;
  first[3] = 20;
  first[4] = 25;
  first[5] = 60;

  int* second = new int[5];
  second[0] = 50;
  second[0] = 40;
  second[0] = 30;
  second[0] = 20;
  second[0] = 10;

  set&lt;int&gt; s1(first, first + 6);
  set&lt;int&gt; s2(second, second + 5);

  vector&lt;int&gt; v1, v2;

  set_difference (s1.begin(), s1.end(), s2.begin(), s2.end(), back_inserter(v1));
  cout &lt;&lt; &quot;difference first - second has &quot; &lt;&lt; v1.size() &lt;&lt; &quot; elements: &quot;;
  copy(v1.begin(), v1.end(), ostream_iterator&lt;int&gt;(cout, &quot; &quot;));
  cout &lt;&lt; endl;

  set_difference (s2.begin(), s2.end(), s1.begin(), s1.end(), back_inserter(v2));
  cout &lt;&lt; &quot;difference second - first has &quot; &lt;&lt; v2.size() &lt;&lt; &quot; elements: &quot;;
  copy(v2.begin(), v2.end(), ostream_iterator&lt;int&gt;(cout, &quot; &quot;));
  cout &lt;&lt; endl;

}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1738520</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1738520</guid><dc:creator><![CDATA[testo]]></dc:creator><pubDate>Tue, 07 Jul 2009 12:08:53 GMT</pubDate></item><item><title><![CDATA[Reply to std::set on Tue, 07 Jul 2009 12:36:20 GMT]]></title><description><![CDATA[<p>testo schrieb:</p>
<blockquote>
<p>und das ergebnis in ein int-heap-array kopieren. ginge das?</p>
</blockquote>
<p>Ja, natürlich!</p>
<blockquote>
<p>mit dem folgenden geht das aber net:</p>
</blockquote>
<p>Also bei mir tut der Code, was ich erwarten würde. Ich meine, das muss nicht das sein, was Du erwartest, aber da Du uns nicht sagst, WAS Deiner Meinung nach nicht funktioniert.......</p>
<p>(Tipp: guck mal auf die Befüllung von second)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1738541</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1738541</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Tue, 07 Jul 2009 12:36:20 GMT</pubDate></item><item><title><![CDATA[Reply to std::set on Tue, 07 Jul 2009 12:49:37 GMT]]></title><description><![CDATA[<p>ok ich versuchs nochmal:</p>
<p>ich hab vorhin nen vector als output gehabt möchte aber (bitte nicht fragen warum) ein int-heap-array als ergebnis.</p>
<p>natürlich haben int-arrays keine iteratoren (oder doch?) und deswegen geht der untere ansatz nicht.</p>
<p>Mir ist auch nicht klar warum ich die int-arrays in sets umkopieren muss über</p>
<pre><code>set&lt;int&gt; s1(first, first + 6);
  set&lt;int&gt; s2(second, second + 5);
</code></pre>
<p>geht das nicht ohne eine Kopie direkt auf der eingabe?</p>
<p>Wie ich alles auf int-arrays umschreibe ist mir nicht ganz klar...</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;algorithm&gt;
#include &lt;vector&gt;
#include &lt;set&gt;
#include &lt;iterator&gt;

using namespace std;

int main ()
{
  int* first = new int[6];
  first[0] = 5;
  first[1] = 10;
  first[2] = 15;
  first[3] = 20;
  first[4] = 25;
  first[5] = 60;

  int* second = new int[5];
  second[0] = 50;
  second[0] = 40;
  second[0] = 30;
  second[0] = 20;
  second[0] = 10;

  set&lt;int&gt; s1(first, first + 6);
  set&lt;int&gt; s2(second, second + 5);

  int* erg = new int[6];

  set_difference (s1.begin(), s1.end(), s2.begin(), s2.end(), back_inserter(v1));
  cout &lt;&lt; &quot;difference first - second has &quot; &lt;&lt; v1.size() &lt;&lt; &quot; elements: &quot;;
  copy(erg.begin(), erg.end(), ostream_iterator&lt;int&gt;(cout, &quot; &quot;));
  cout &lt;&lt; endl;
/*
  set_difference (s2.begin(), s2.end(), s1.begin(), s1.end(), back_inserter(v2));
  cout &lt;&lt; &quot;difference second - first has &quot; &lt;&lt; v2.size() &lt;&lt; &quot; elements: &quot;;
  copy(erg.begin(), erg.end(), ostream_iterator&lt;int&gt;(cout, &quot; &quot;));
  cout &lt;&lt; endl;*/

}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1738551</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1738551</guid><dc:creator><![CDATA[testo]]></dc:creator><pubDate>Tue, 07 Jul 2009 12:49:37 GMT</pubDate></item><item><title><![CDATA[Reply to std::set on Tue, 07 Jul 2009 13:08:44 GMT]]></title><description><![CDATA[<p>testo schrieb:</p>
<blockquote>
<p>natürlich haben int-arrays keine iteratoren (oder doch?)</p>
</blockquote>
<p>Doch, Du benutzt sie bereits:</p>
<pre><code>set&lt;int&gt; s1(first, first + 6);
  set&lt;int&gt; s2(second, second + 5);
</code></pre>
<blockquote>
<p>Mir ist auch nicht klar warum ich die int-arrays in sets umkopieren muss</p>
</blockquote>
<p>Warum meinst Du denn, das zu müssen?</p>
<p>EDIT:<br />
Das einzige, was set_difference verlangt, ist, dass beide Sequenzen aufsteigend sortiert sind. Das kannst Du auch mit stdd::sort() direkt auf dem Array (wie oben) erreichen.</p>
<pre><code class="language-cpp">/* ... */

int main ()
{
  int* first = new int[6];
  first[0] = 5;
  first[1] = 10;
  first[2] = 15;
  first[3] = 20;
  first[4] = 25;
  first[5] = 60;

  int* second = new int[5];
  second[0] = 50;
  second[0] = 40; /* &lt;- *räusper* */
  second[0] = 30;
  second[0] = 20;
  second[0] = 10;

  set&lt;int&gt; s1(first, first + 6);
  set&lt;int&gt; s2(second, second + 5);

  int* erg = new int[6];

  set_difference (first, first + 6, second, second + 5, erg);

  /* Rest bitte analog :D */

}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1738561</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1738561</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Tue, 07 Jul 2009 13:08:44 GMT</pubDate></item><item><title><![CDATA[Reply to std::set on Tue, 07 Jul 2009 13:18:30 GMT]]></title><description><![CDATA[<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /> ja danke....aber mit dem jetzigen ansatz funktioniert mein set_difference net...erg == first ?</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;algorithm&gt;
#include &lt;vector&gt;
#include &lt;set&gt;
#include &lt;iterator&gt;

using namespace std;

int main ()
{
int* first = new int[6];
  first[0] = 5;
  first[1] = 10;
  first[2] = 15;
  first[3] = 20;
  first[4] = 25;
  first[5] = 60;

  int* second = new int[5];
  second[0] = 50;
  second[1] = 40; /* &lt;- *räusper* */
  second[2] = 30;
  second[3] = 20;
  second[4] = 10;

  int* erg = new int[6];

  set_difference (first, first + 6, second, second + 5, erg); 

  cout &lt;&lt; &quot;erg: &quot;;
  for( int i = 0; i &lt; 6; i++)
        cout &lt;&lt; erg[i] &lt;&lt; &quot; &quot;;
  cout &lt;&lt; endl;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1738571</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1738571</guid><dc:creator><![CDATA[testo]]></dc:creator><pubDate>Tue, 07 Jul 2009 13:18:30 GMT</pubDate></item><item><title><![CDATA[Reply to std::set on Tue, 07 Jul 2009 13:20:12 GMT]]></title><description><![CDATA[<p>ah shit....die sortierung hat gefehlt.... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /></p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;algorithm&gt;
#include &lt;vector&gt;
#include &lt;set&gt;
#include &lt;iterator&gt;

using namespace std;

int main ()
{
int* first = new int[6];
  first[0] = 5;
  first[1] = 10;
  first[2] = 15;
  first[3] = 20;
  first[4] = 25;
  first[5] = 60;

  int* second = new int[5];
  second[0] = 50;
  second[1] = 40; /* &lt;- *räusper* */
  second[2] = 30;
  second[3] = 20;
  second[4] = 10;

  sort(second, second + 5);

  int* erg = new int[6];

  set_difference (first, first + 6, second, second + 5, erg); 

  cout &lt;&lt; &quot;erg: &quot;;
  for( int i = 0; i &lt; 6; i++)
        cout &lt;&lt; erg[i] &lt;&lt; &quot; &quot;;
  cout &lt;&lt; endl;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1738574</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1738574</guid><dc:creator><![CDATA[testo]]></dc:creator><pubDate>Tue, 07 Jul 2009 13:20:12 GMT</pubDate></item><item><title><![CDATA[Reply to std::set on Tue, 07 Jul 2009 13:20:36 GMT]]></title><description><![CDATA[<p>Siehe mein EDIT im letzten Beitrag <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1738575</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1738575</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Tue, 07 Jul 2009 13:20:36 GMT</pubDate></item><item><title><![CDATA[Reply to std::set on Tue, 07 Jul 2009 13:21:24 GMT]]></title><description><![CDATA[<p>was wäre denn eine möglichkeit wenn man nicht weiß welche der mengen größer ist...also die differenz unabhängig von der unterschiedlichen länge der mengen zu berechnen. Das ist ja jetzt alles hard-codiert...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1738576</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1738576</guid><dc:creator><![CDATA[testo]]></dc:creator><pubDate>Tue, 07 Jul 2009 13:21:24 GMT</pubDate></item><item><title><![CDATA[Reply to std::set on Tue, 07 Jul 2009 13:25:56 GMT]]></title><description><![CDATA[<p>LordJaxom schrieb:</p>
<blockquote>
<p>Siehe mein EDIT im letzten Beitrag <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>
</blockquote>
<p>In deinem Code wird aber immer nocht <code>std::set&lt;int&gt;</code> verwendet, satt <code>std::sort</code> <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>Im übrigen wäre ich vorsichtig mit der Aussage, dass ein Heaparray auch Iteratoren hat. Grundsätzlich erfüllen einfach die Zeiger eines Arrays das Konzept des Random Access Iterator.</p>
<p>testo schrieb:</p>
<blockquote>
<p>was wäre denn eine möglichkeit wenn man nicht weiß welche der mengen größer ist...also die differenz unabhängig von der unterschiedlichen länge der mengen zu berechnen. Das ist ja jetzt alles hard-codiert...</p>
</blockquote>
<p>Du musst bei rohen C Arrays immer irgendwie die Grösse mitführen, anders geht es nicht. Deshalb verwendet man in C++ meistens gleich die STL Container.</p>
<p>Übrigens, es empfiehlt sich auch auf den Rückgabewert von <code>set_difference</code> zu acht, vor allem wenn du mit C Arrays herumspielst. Sonst gibst du am Ende womöglich noch zu viele Ergebnisse 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>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1738580</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1738580</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Tue, 07 Jul 2009 13:25:56 GMT</pubDate></item><item><title><![CDATA[Reply to std::set on Tue, 07 Jul 2009 13:30:53 GMT]]></title><description><![CDATA[<p>ginge denn sowas: also ohne zwischenkopie, d.h ich schaue first an und schreibe aber auch gleich in first rein....oder passiert dann was unschönes <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>
<pre><code class="language-cpp">set_difference (first, first + 6, second, second + 5, first);
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1738588</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1738588</guid><dc:creator><![CDATA[testo]]></dc:creator><pubDate>Tue, 07 Jul 2009 13:30:53 GMT</pubDate></item><item><title><![CDATA[Reply to std::set on Tue, 07 Jul 2009 13:33:21 GMT]]></title><description><![CDATA[<p>ich frage deshalb weil ich z.B. in einer schleife eine differenz von 100 int-arrays erreichen möchte und nicht in jeder iteration das erg-array neu aufsetzen will und das alte löschen. bzw. ich will nix rumkopieren...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1738594</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1738594</guid><dc:creator><![CDATA[testo]]></dc:creator><pubDate>Tue, 07 Jul 2009 13:33:21 GMT</pubDate></item><item><title><![CDATA[Reply to std::set on Tue, 07 Jul 2009 13:33:48 GMT]]></title><description><![CDATA[<p>testo schrieb:</p>
<blockquote>
<p>ginge denn sowas: also ohne zwischenkopie, d.h ich schaue first an und schreibe aber auch gleich in first rein....oder passiert dann was unschönes <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>
</blockquote>
<p>Wenn du garantieren kannst, dass der Speicher hinter <code>first</code> gross genug ist, dann geht das. Sobald du über die Speichergrenzen schreibst, gibt es undefiniertes Verhalten.</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1738595</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1738595</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Tue, 07 Jul 2009 13:33:48 GMT</pubDate></item><item><title><![CDATA[Reply to std::set on Tue, 07 Jul 2009 13:33:51 GMT]]></title><description><![CDATA[<p>Dravere schrieb:</p>
<blockquote>
<p>LordJaxom schrieb:</p>
<blockquote>
<p>Siehe mein EDIT im letzten Beitrag <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>
</blockquote>
<p>In deinem Code wird aber immer nocht <code>std::set&lt;int&gt;</code> verwendet, satt <code>std::sort</code> <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>
</blockquote>
<p>Deshalb auch: Siehe mein EDIT, nicht siehe mein CODE <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="😃"
    /><br />
(Davon ab sind s1 und s2 nur stehengeblieben, sie werden nicht verwendet)</p>
<blockquote>
<p>Im übrigen wäre ich vorsichtig mit der Aussage, dass ein Heaparray auch Iteratoren hat. Grundsätzlich erfüllen einfach die Zeiger eines Arrays das Konzept des Random Access Iterator.</p>
</blockquote>
<p>Man kann also beliebige Punkte in Arrays durch etwas beschreiben, was sich wie ein RndIt verhält, ok?</p>
<blockquote>
<p>Du musst bei rohen C Arrays immer irgendwie die Grösse mitführen, anders geht es nicht. Deshalb verwendet man in C++ meistens gleich die STL Container.</p>
</blockquote>
<p>Bei *echten* Arrays funktioniert <code>sizeof(array)/sizeof(*array)</code> und ist auch ein etabliertes Konzept.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1738596</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1738596</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Tue, 07 Jul 2009 13:33:51 GMT</pubDate></item><item><title><![CDATA[Reply to std::set on Tue, 07 Jul 2009 13:35:22 GMT]]></title><description><![CDATA[<p>testo schrieb:</p>
<blockquote>
<p>ginge denn sowas: also ohne zwischenkopie, d.h ich schaue first an und schreibe aber auch gleich in first rein....oder passiert dann was unschönes <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>
<pre><code class="language-cpp">set_difference (first, first + 6, second, second + 5, first);
</code></pre>
</blockquote>
<p>Nein - laut Standard ist das nicht zulässig. Dort heißt es:</p>
<blockquote>
<p>Requires: The resulting range shall not overlap with either of the original ranges.</p>
</blockquote>
<p>Was ist hier mit:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;algorithm&gt;
#include &lt;set&gt;
#include &lt;iterator&gt;

using namespace std;

int main ()
{
    int first[] = { 5, 10, 15, 20, 25, 60 };
    int* firstEnd = first + sizeof(first)/sizeof(*first);
    int second[] = { 50, 40, 30, 20, 10 };
    int* secondEnd = second + sizeof(second)/sizeof(*second);

    sort( second, secondEnd );  // beide Mengen müsen sortiert sein

    set&lt; int &gt; erg;
    set_difference (first, firstEnd, second, secondEnd, inserter( erg, erg.begin() ));

    cout &lt;&lt; &quot;erg: &quot;;
    for( set&lt; int &gt;::iterator i = erg.begin(); i != erg.end(); ++i)
        cout &lt;&lt; *i &lt;&lt; &quot; &quot;;
    cout &lt;&lt; endl;
    return 0;
}
</code></pre>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1738599</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1738599</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Tue, 07 Jul 2009 13:35:22 GMT</pubDate></item><item><title><![CDATA[Reply to std::set on Tue, 07 Jul 2009 13:42:11 GMT]]></title><description><![CDATA[<blockquote>
<p>Nein - laut Standard ist das nicht zulässig</p>
</blockquote>
<p>hmm...wie sollte dann eine schleife für unbeschränkte differenzen von mehreren arrays aussehen...</p>
<p>Und bekomme ihc irgendwie dabei heraus wie lang das ergebnis ist? ANgenommen ich initialisiere das ausgangsarray genügend groß und operiere nur auf einem Teil. Kann ich über set-difference irgendwie herausfinden wie groß mein array am ende ist?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1738607</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1738607</guid><dc:creator><![CDATA[testo]]></dc:creator><pubDate>Tue, 07 Jul 2009 13:42:11 GMT</pubDate></item><item><title><![CDATA[Reply to std::set on Tue, 07 Jul 2009 13:47:49 GMT]]></title><description><![CDATA[<p>LordJaxom schrieb:</p>
<blockquote>
<p>Deshalb auch: Siehe mein EDIT, nicht siehe mein CODE <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="😃"
    /><br />
(Davon ab sind s1 und s2 nur stehengeblieben, sie werden nicht verwendet)</p>
</blockquote>
<p>Jo, aber der Code ist falsch <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>LordJaxom schrieb:</p>
<blockquote>
<p>Man kann also beliebige Punkte in Arrays durch etwas beschreiben, was sich wie ein RndIt verhält, ok?</p>
</blockquote>
<p>Hmmmm, Punkte in Arrays? <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="😃"
    /><br />
Mir ging es ja nur darum, dass niemand auf so eine Idee kommt:</p>
<pre><code class="language-cpp">int arr[4] = { /* .. */ };
std::sort(arr.begin(), arr.end());
</code></pre>
<p><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>LordJaxom schrieb:</p>
<blockquote>
<p>Bei *echten* Arrays funktioniert <code>sizeof(array)/sizeof(*array)</code> und ist auch ein etabliertes Konzept.</p>
</blockquote>
<p>Nur sind *echte* Arrays extrem flüchtig. Einmal an eine Funktion übergeben, welche kein Funktionstemplate darstellt, und schon ist das Array weg und man hat nur noch einen Zeiger.</p>
<p>Werner Salomon schrieb:</p>
<blockquote>
<p>Nein - laut Standard ist das nicht zulässig. Dort heißt es:</p>
<blockquote>
<p>Requires: The resulting range shall not overlap with either of the original ranges.</p>
</blockquote>
</blockquote>
<p>Hmm, tatsächlich. Aber wieso? Leuchtet mir grad nicht so ein.<br />
Edit: Erklärung ist überflüssig. Ist mir grad klar geworden <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>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1738608</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1738608</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Tue, 07 Jul 2009 13:47:49 GMT</pubDate></item><item><title><![CDATA[Reply to std::set on Tue, 07 Jul 2009 13:46:16 GMT]]></title><description><![CDATA[<p>Ich finde das eine komische Sache, da das Kopieren eines int-Werts dem eines Zeigers geschwindigkeitstechnisch nicht unterlegen sein sollte <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61b.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_tongue"
      title=":P"
      alt="😛"
    /><br />
Deshalb verzichte auf den ganzen Array-Firlefanz und verwende std::vector&lt;int&gt; <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61b.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_tongue"
      title=":P"
      alt="😛"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1738616</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1738616</guid><dc:creator><![CDATA[Wackeldackel]]></dc:creator><pubDate>Tue, 07 Jul 2009 13:46:16 GMT</pubDate></item><item><title><![CDATA[Reply to std::set on Tue, 07 Jul 2009 13:53:44 GMT]]></title><description><![CDATA[<p>testo schrieb:</p>
<blockquote>
<blockquote>
<p>Nein - laut Standard ist das nicht zulässig</p>
</blockquote>
<p>hmm...wie sollte dann eine schleife für unbeschränkte differenzen von mehreren arrays aussehen...</p>
</blockquote>
<p>so wie im Code oben - das eine hat mit dem anderen nichts zu tun</p>
<p>testo schrieb:</p>
<blockquote>
<p>Und bekomme ihc irgendwie dabei heraus wie lang das ergebnis ist? ANgenommen ich initialisiere das ausgangsarray genügend groß und operiere nur auf einem Teil. Kann ich über set-difference irgendwie herausfinden wie groß mein array am ende ist?</p>
</blockquote>
<p>Verabschiede Dich doch endlich von diesem leidigen</p>
<pre><code class="language-cpp">new int[..]
</code></pre>
<p>benutze statt dessen std::vector&lt;&gt; oder die anderen Container, die kümmern sich dann schon um den Speicher. Mit einem vector sähe mein Beispiel so aus:</p>
<pre><code class="language-cpp">vector&lt; int &gt; erg;
    set_difference (first, firstEnd, second, secondEnd, back_inserter( erg ));
</code></pre>
<p>wie u.a. pumuckl es auch schon vorgeschlagen hat. Und da ist auch keine Größe fest vorgegeben.</p>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1738621</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1738621</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Tue, 07 Jul 2009 13:53:44 GMT</pubDate></item><item><title><![CDATA[Reply to std::set on Tue, 07 Jul 2009 13:53:51 GMT]]></title><description><![CDATA[<p>Ich mag die typsichere Grössenfunktion für echte Arrays trotzdem: <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>
<pre><code class="language-cpp">template &lt;typename T, size_t Size&gt;
size_t ArraySize(T (&amp;Array)[Size])
{
    return Size;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1738622</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1738622</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Tue, 07 Jul 2009 13:53:51 GMT</pubDate></item><item><title><![CDATA[Reply to std::set on Tue, 07 Jul 2009 13:57:13 GMT]]></title><description><![CDATA[<p>ja...mir ist schon klar dass ich vector benutzen könnte.</p>
<p>Im Moment habe ich einen fertigen code vor mir der richtig tut und komplett auf int-arrays arbeitet. Und ich will nur eine Methode umschreiben weil ich glaube da performance rausholen zu können. Und dazu will set_difference bzw. set_union.</p>
<p>Und deswegen frag ich die ganze zeit nach der int-variante <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1738626</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1738626</guid><dc:creator><![CDATA[testo]]></dc:creator><pubDate>Tue, 07 Jul 2009 13:57:13 GMT</pubDate></item></channel></rss>