<?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[resize() für std::set]]></title><description><![CDATA[<p>Hi,</p>
<p>wie kann man denn am besten für einen Container vom Typ std::set&lt;T&gt; eine maximale Obergrenze für Anzahl der Elemente in der Menge durchsetzen, ohne über alle Elemente iterieren zu müssen? Leider besitzt set keine resize()-Methode, wie sie beispielsweise std::vector anbietet. Es müsste nicht mal unbedingt set sein, aber ich benötige halt einen Container mit einer festen Anzahl von Elementen, die eindeutig und sortiert sind. Gibt es da eine effiziente Lösung?</p>
<p>Vielen Dank schon mal im Voraus.</p>
<p>Gruß<br />
TomG</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/134847/resize-für-std-set</link><generator>RSS for Node</generator><lastBuildDate>Fri, 28 Aug 2026 17:37:23 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/134847.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 29 Jan 2006 10:17:54 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to resize() für std::set on Sun, 29 Jan 2006 10:17:54 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>wie kann man denn am besten für einen Container vom Typ std::set&lt;T&gt; eine maximale Obergrenze für Anzahl der Elemente in der Menge durchsetzen, ohne über alle Elemente iterieren zu müssen? Leider besitzt set keine resize()-Methode, wie sie beispielsweise std::vector anbietet. Es müsste nicht mal unbedingt set sein, aber ich benötige halt einen Container mit einer festen Anzahl von Elementen, die eindeutig und sortiert sind. Gibt es da eine effiziente Lösung?</p>
<p>Vielen Dank schon mal im Voraus.</p>
<p>Gruß<br />
TomG</p>
]]></description><link>https://www.c-plusplus.net/forum/post/979623</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/979623</guid><dc:creator><![CDATA[TomG]]></dc:creator><pubDate>Sun, 29 Jan 2006 10:17:54 GMT</pubDate></item><item><title><![CDATA[Reply to resize() für std::set on Sun, 29 Jan 2006 10:30:32 GMT]]></title><description><![CDATA[<p>Set ist ein Baum, du brauchst nicht resizen bevor du viele Elemente einfügst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/979632</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/979632</guid><dc:creator><![CDATA[Setter]]></dc:creator><pubDate>Sun, 29 Jan 2006 10:30:32 GMT</pubDate></item><item><title><![CDATA[Reply to resize() für std::set on Sun, 29 Jan 2006 10:44:47 GMT]]></title><description><![CDATA[<p>Setter schrieb:</p>
<blockquote>
<p>Set ist ein Baum, du brauchst nicht resizen bevor du viele Elemente einfügst.</p>
</blockquote>
<p>Das ist richtig, mein Problem ist allerdings, dass ich nur eine bestimmte Anzahl von Elementen einfügen darf. Wenn diese Obergrenze überschritten wird, muss ich irgendwie die überzähligen Elemente loswerden. Bei std::vector würde ich das mit resize(obergrenze) machen, aber bei std::set gibt es das nicht. Deshalb iteriere ich momentan über die Menge und verwende eine Laufvariable, um zu ermitteln, ab wann ich Elemente entfernen muss:</p>
<pre><code class="language-cpp">std::set&lt;T&gt; menge;
...
int i = 0;
for ( std::set&lt;T&gt;::iterator it = menge.begin(); it != menge.end(); it++ )
{
  if ( i &gt; obergrenze ) menge.erase(it);
  i++;
}
</code></pre>
<p>Das ist allerdings ziemlich ineffizient und meine Frage ist, ob und wie es effizienter geht?</p>
<p>Gruß<br />
TomG</p>
]]></description><link>https://www.c-plusplus.net/forum/post/979649</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/979649</guid><dc:creator><![CDATA[TomG]]></dc:creator><pubDate>Sun, 29 Jan 2006 10:44:47 GMT</pubDate></item><item><title><![CDATA[Reply to resize() für std::set on Sun, 29 Jan 2006 10:48:32 GMT]]></title><description><![CDATA[<p>TomG schrieb:</p>
<blockquote>
<p>Leider besitzt set keine resize()-Methode, wie sie beispielsweise std::vector anbietet.</p>
</blockquote>
<p>Hallo TomG,</p>
<p>resize auf set ist ein Widerspruch in sich!</p>
<p>TomG schrieb:</p>
<blockquote>
<p>Es müsste nicht mal unbedingt set sein, aber ich benötige halt einen Container mit einer festen Anzahl von Elementen, die eindeutig und sortiert sind.</p>
</blockquote>
<p>Was genau möchstest Du erreichen? Wenn alle Elemente eindeutig sein sollen, was soll der Container - egal welchen Typs - nach einem resize, der den Container vergrößert, an Elementen enthalten?</p>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/979655</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/979655</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Sun, 29 Jan 2006 10:48:32 GMT</pubDate></item><item><title><![CDATA[Reply to resize() für std::set on Sun, 29 Jan 2006 10:54:15 GMT]]></title><description><![CDATA[<p>Werner Salomon schrieb:</p>
<blockquote>
<p>Wenn alle Elemente eindeutig sein sollen, was soll der Container - egal welchen Typs - nach einem resize, der den Container vergrößert, an Elementen enthalten?</p>
</blockquote>
<p>Ich möchte mit resize() den Container verkleinern, nicht vergrößern.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/979656</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/979656</guid><dc:creator><![CDATA[TomG]]></dc:creator><pubDate>Sun, 29 Jan 2006 10:54:15 GMT</pubDate></item><item><title><![CDATA[Reply to resize() für std::set on Sun, 29 Jan 2006 10:55:29 GMT]]></title><description><![CDATA[<p>TomG schrieb:</p>
<blockquote>
<p>Das ist richtig, mein Problem ist allerdings, dass ich nur eine bestimmte Anzahl von Elementen einfügen darf. Wenn diese Obergrenze überschritten wird, muss ich irgendwie die überzähligen Elemente loswerden.</p>
</blockquote>
<p>Ich vermute, dass die Lösung Deines Problems nicht darin liegt, die überzähligen Elemente 'effizient' zu entfernen, sondern im 'weiteren Umkreis'. Kannst Du da mehr dazu sagen.<br />
Wozu brauchst Du die feste Anzahl und bei welcher Gelegenheit kommen die Elemente in den Container?</p>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/979657</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/979657</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Sun, 29 Jan 2006 10:55:29 GMT</pubDate></item><item><title><![CDATA[Reply to resize() für std::set on Sun, 29 Jan 2006 11:02:42 GMT]]></title><description><![CDATA[<p>Hallo Werner,</p>
<blockquote>
<p>Wozu brauchst Du die feste Anzahl und bei welcher Gelegenheit kommen die Elemente in den Container?</p>
</blockquote>
<p>Ich sammle in dem Container Werte, die numerisch aufsteigend sortiert sein sollen. Es dürfen keine zwei Werte doppelt darin vorkommen und der Container darf maximal n solcher Werte beinhalten. Ich denke, dass ein set diese Anforderungen sehr gut erfüllt, da ich lediglich insert(wert) aufrufen muss und sich set um die Reihenfolge und Duplikateliminierung kümmert. Das einzige Problem ist: die Menge wächst kontinuierlich an, d.h., die Anzahl der Elemente der Menge übersteigt irgendwann n. Das muss ich verhindern. Die Frage ist: wie kann ich das verhindern?</p>
<p>Gruß<br />
TomG</p>
]]></description><link>https://www.c-plusplus.net/forum/post/979661</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/979661</guid><dc:creator><![CDATA[TomG]]></dc:creator><pubDate>Sun, 29 Jan 2006 11:02:42 GMT</pubDate></item><item><title><![CDATA[Reply to resize() für std::set on Sun, 29 Jan 2006 11:19:04 GMT]]></title><description><![CDATA[<p>TomG schrieb:</p>
<blockquote>
<p>Ich sammle in dem Container Werte, die numerisch aufsteigend sortiert sein sollen. Es dürfen keine zwei Werte doppelt darin vorkommen und der Container darf maximal n solcher Werte beinhalten. Ich denke, dass ein set diese Anforderungen sehr gut erfüllt, da ich lediglich insert(wert) aufrufen muss und sich set um die Reihenfolge und Duplikateliminierung kümmert. Das einzige Problem ist: die Menge wächst kontinuierlich an, d.h., die Anzahl der Elemente der Menge übersteigt irgendwann n. Das muss ich verhindern. Die Frage ist: wie kann ich das verhindern?</p>
</blockquote>
<p>Hallo TomG,</p>
<p>interessant wäre zu erfahren, bei welcher Gelgenheit die numerischen Werte in den Container kommen. Im Prinzip kannst Du doch nach jedem insert fragen, ob die zulässige Länge 'n' überschritten ist und dann nur das letze Element löschen. Am besten vielleicht mit einem kleinem Wrapper ..</p>
<pre><code class="language-cpp">template&lt; typename T &gt;
class setN
{
public:
    typedef std::set&lt; T &gt; container_type;

    explicit setN( unsigned n ) : m_n( n ) {}
    std::pair&lt; typename container_type::iterator, bool &gt; insert( const T&amp; x ) 
    {  
        std::pair&lt; typename container_type::iterator, bool &gt; ret = m_set.insert( x );
        if( m_set.size() &gt; m_n )
        {
            typename container_type::iterator i = m_set.end();
            m_set.erase( --i );
        }
        return ret;
    }
    // -- und weitere Methoden für den Zugriff auf set
private:
    unsigned m_n;
    std::set&lt; T &gt; m_set;
};
</code></pre>
<p>Wenn das zuletzt eingefügte Element das letzte sein sollte, wird es aber gleich wieder gelöscht. Ist das ok?</p>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/979671</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/979671</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Sun, 29 Jan 2006 11:19:04 GMT</pubDate></item><item><title><![CDATA[Reply to resize() für std::set on Sun, 29 Jan 2006 12:22:00 GMT]]></title><description><![CDATA[<blockquote>
<p>Im Prinzip kannst Du doch nach jedem insert fragen, ob die zulässige Länge 'n' überschritten ist und dann nur das letze Element löschen.</p>
</blockquote>
<p>Ja, du hast vollkommen Recht, das sollte gehen. Ich überprüfe jetzt einfach nach jedem insert, ob die Obergrenze überschritten ist, und lösche ggf. das letzte element mit</p>
<pre><code class="language-cpp">set.erase(--set.end())
</code></pre>
<p>Danke jedenfalls für die Hilfe, ich hab mal wieder viel zu kompliziert gedacht...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/979705</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/979705</guid><dc:creator><![CDATA[TomG]]></dc:creator><pubDate>Sun, 29 Jan 2006 12:22:00 GMT</pubDate></item></channel></rss>