<?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[Welcher STL Container zum sortierten Einfügen?]]></title><description><![CDATA[<p>Hi,</p>
<p>ich habe eine Liste von Events welche alle eine Art &quot;Soll-Zeit&quot; haben zu welcher sie frühstens abgearbeitet werden sollen.<br />
Neue Events sollen dabei sortiert nach der Zeit in meine Liste eingefügt werden, das Abarbeiten der Events soll dann auf der garantiert immer schon sortierten Liste geschehen.</p>
<p>Momentan benutze ich eine std::multimap&lt; float, IEvent* &gt;, wobei der Schlüssel die Abarbeitungszeit beinhaltet. Beim Einfügen eines neuen Elements in meine multimap wird ja das less-ordering beibehalten.</p>
<p>Das abarbeiten der &quot;Liste&quot; (multimap) mache ich dann wie folgt:</p>
<pre><code class="language-cpp">//iterate through delayed event queue
DelayedEventQueue::iterator it = m_DelayedEvtQueue.begin();
DelayedEventQueue::iterator itEnd = m_DelayedEvtQueue.end();
while( it != itEnd &amp;&amp; it-&gt;first &lt; fAktuelleZeit )
{
	IEvent *pEvt = it-&gt;second;
	FireEventImmediate( pEvt );
	it++;
}

if( it != m_DelayedEvtQueue.begin() )
	m_DelayedEvtQueue.erase( m_DelayedEvtQueue.begin(), it-- );
</code></pre>
<p>Nun zu meiner Frage: haltet ihr das für eine gute (effektive) Lösung, und wenn nicht was würdet ihr ansonsten empfehlen?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/292067/welcher-stl-container-zum-sortierten-einfügen</link><generator>RSS for Node</generator><lastBuildDate>Mon, 17 Aug 2026 08:32:16 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/292067.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 02 Sep 2011 07:32:38 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Welcher STL Container zum sortierten Einfügen? on Fri, 02 Sep 2011 07:32:38 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>ich habe eine Liste von Events welche alle eine Art &quot;Soll-Zeit&quot; haben zu welcher sie frühstens abgearbeitet werden sollen.<br />
Neue Events sollen dabei sortiert nach der Zeit in meine Liste eingefügt werden, das Abarbeiten der Events soll dann auf der garantiert immer schon sortierten Liste geschehen.</p>
<p>Momentan benutze ich eine std::multimap&lt; float, IEvent* &gt;, wobei der Schlüssel die Abarbeitungszeit beinhaltet. Beim Einfügen eines neuen Elements in meine multimap wird ja das less-ordering beibehalten.</p>
<p>Das abarbeiten der &quot;Liste&quot; (multimap) mache ich dann wie folgt:</p>
<pre><code class="language-cpp">//iterate through delayed event queue
DelayedEventQueue::iterator it = m_DelayedEvtQueue.begin();
DelayedEventQueue::iterator itEnd = m_DelayedEvtQueue.end();
while( it != itEnd &amp;&amp; it-&gt;first &lt; fAktuelleZeit )
{
	IEvent *pEvt = it-&gt;second;
	FireEventImmediate( pEvt );
	it++;
}

if( it != m_DelayedEvtQueue.begin() )
	m_DelayedEvtQueue.erase( m_DelayedEvtQueue.begin(), it-- );
</code></pre>
<p>Nun zu meiner Frage: haltet ihr das für eine gute (effektive) Lösung, und wenn nicht was würdet ihr ansonsten empfehlen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2113714</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2113714</guid><dc:creator><![CDATA[RedPuma]]></dc:creator><pubDate>Fri, 02 Sep 2011 07:32:38 GMT</pubDate></item><item><title><![CDATA[Reply to Welcher STL Container zum sortierten Einfügen? on Fri, 02 Sep 2011 07:36:51 GMT]]></title><description><![CDATA[<p>Es gibt da noch <a href="http://cplusplus.com/reference/stl/priority_queue/" rel="nofollow">priority_queue</a>.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2113716</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2113716</guid><dc:creator><![CDATA[TyRoXx]]></dc:creator><pubDate>Fri, 02 Sep 2011 07:36:51 GMT</pubDate></item><item><title><![CDATA[Reply to Welcher STL Container zum sortierten Einfügen? on Fri, 02 Sep 2011 07:49:24 GMT]]></title><description><![CDATA[<p>also ca. so?</p>
<pre><code class="language-cpp">bool EventGreater( const IEvent &amp;*pEvt1, const IEvent &amp;*pEvt2 )
{
    return pEvt1-&gt;GetProcessTime() &gt; pEvt2-&gt;GetProcessTime();
}

typedef std::priority_queue&lt;IEvent*, std::vector&lt;IEvent*&gt;, &amp;EventGreater&gt; DelayedEventList;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2113720</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2113720</guid><dc:creator><![CDATA[RedPuma]]></dc:creator><pubDate>Fri, 02 Sep 2011 07:49:24 GMT</pubDate></item><item><title><![CDATA[Reply to Welcher STL Container zum sortierten Einfügen? on Fri, 02 Sep 2011 08:20:51 GMT]]></title><description><![CDATA[<p>Also ich habe es jetzt wie folgt gemacht:</p>
<pre><code class="language-cpp">class CEventComparison
{
public:
	bool operator()( const IEvent *pEvtLeft, const IEvent *pEvtRight ) const {
		return pEvtLeft-&gt;GetProcessTime() &gt; pEvtRight-&gt;GetProcessTime();
	}
};

typedef std::priority_queue&lt;IEvent*, std::vector&lt;IEvent*&gt;, CEventComparison&gt; DelayedEventQueue;
</code></pre>
<p>Ich bekomme nur leider den Fehler: &quot;Fehler 1 error C2039: 'GetProcessTime': Ist kein Element von 'IEvent'&quot;, und das obwohl in meiner IEvent-Klasse ganz eindeutig steht:</p>
<pre><code class="language-cpp">inline const float &amp;GetProcessTime( void ) const { return m_fProcessTime; }
</code></pre>
<p>Bin grad etwas ratlos.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2113729</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2113729</guid><dc:creator><![CDATA[RedPuma]]></dc:creator><pubDate>Fri, 02 Sep 2011 08:20:51 GMT</pubDate></item><item><title><![CDATA[Reply to Welcher STL Container zum sortierten Einfügen? on Fri, 02 Sep 2011 08:25:32 GMT]]></title><description><![CDATA[<p>Steht das tatsächlich in der IEvent Klasse oder in der Klasse, die IEvent implementiert? Sieht halt nach einem &quot;Interface&quot; aus, wo man normalerwiese keine Implementierung drin hat.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2113731</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2113731</guid><dc:creator><![CDATA[brotbernd]]></dc:creator><pubDate>Fri, 02 Sep 2011 08:25:32 GMT</pubDate></item><item><title><![CDATA[Reply to Welcher STL Container zum sortierten Einfügen? on Fri, 02 Sep 2011 08:43:03 GMT]]></title><description><![CDATA[<p>Nene GetProcessTime() ist in IEvent selber implementiert. Ich habe grad mal versucht bei IEvent die CEventComparison class als friend einzutragen und direkt auf den entsprechenden (privaten) Member zuzugreifen, selber Fehler...</p>
<p>//EDIT:<br />
*Facepalm*</p>
<pre><code class="language-cpp">#ifdef _CLIENT
	inline const float &amp;GetProcessTime( void ) const { return m_fProcessTime; }
	inline void SetProcessTime( const float &amp;time ) { m_fProcessTime = time; }
#endif
</code></pre>
<p>Man sollte dann natürlich die CEventComparison Class auch mit #ifdef umschließen -.-</p>
<p>Vielen Dank <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>
]]></description><link>https://www.c-plusplus.net/forum/post/2113733</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2113733</guid><dc:creator><![CDATA[RedPuma]]></dc:creator><pubDate>Fri, 02 Sep 2011 08:43:03 GMT</pubDate></item><item><title><![CDATA[Reply to Welcher STL Container zum sortierten Einfügen? on Fri, 02 Sep 2011 08:42:45 GMT]]></title><description><![CDATA[<p>Hm ohne Code nihct nachvollziehbar.</p>
<pre><code class="language-cpp">class Event
{
public:
    Event(float time) : time_(time){}
    float GetProcessTime() const { return time_; }
    virtual void Fire() const = 0;
private :
    float time_;
};

class HalloEvent : public Event
{
public:
    HalloEvent(float time) : Event(time){}
    void Fire() const
    {
        std::cout &lt;&lt; &quot;Hallo\n&quot;;
    }
};

class EventComparison
{
public:
    bool operator()( const Event *lh, const Event *rh ) const {
        return lh-&gt;GetProcessTime() &gt; rh-&gt;GetProcessTime();
    }
}; 

template&lt;typename Queue&gt;
void FireNext(Queue&amp; eventQueue)
{
    Event* nextEvent = eventQueue.top();
    // hier sollte man unbedingt noch über Ausnahmesicherheit nachdenken!
    eventQueue.pop();
    nextEvent-&gt;Fire();
    delete nextEvent;
}

int main()
{
    typedef std::priority_queue&lt;Event*, std::vector&lt;Event*&gt;, EventComparison&gt; DelayedEventQueue;
    DelayedEventQueue queue;
    queue.push(new HalloEvent(1.0));
    while(!queue.empty())
        FireNext(queue);

    return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2113737</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2113737</guid><dc:creator><![CDATA[brotbernd]]></dc:creator><pubDate>Fri, 02 Sep 2011 08:42:45 GMT</pubDate></item><item><title><![CDATA[Reply to Welcher STL Container zum sortierten Einfügen? on Fri, 02 Sep 2011 08:45:55 GMT]]></title><description><![CDATA[<p>Danke für deine Mühe aber ich bin über den Preprocessor gestolpert (siehe oben der Post). Hat nicht jemand mal gesagt &quot;The Preprocessor is evil&quot; ?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2113739</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2113739</guid><dc:creator><![CDATA[RedPuma]]></dc:creator><pubDate>Fri, 02 Sep 2011 08:45:55 GMT</pubDate></item><item><title><![CDATA[Reply to Welcher STL Container zum sortierten Einfügen? on Fri, 02 Sep 2011 08:50:02 GMT]]></title><description><![CDATA[<p>RedPuma schrieb:</p>
<blockquote>
<p>//EDIT:<br />
*Facepalm*</p>
<pre><code class="language-cpp">#ifdef _CLIENT
	inline const float &amp;GetProcessTime( void ) const { return m_fProcessTime; }
	inline void SetProcessTime( const float &amp;time ) { m_fProcessTime = time; }
#endif
</code></pre>
</blockquote>
<p>Oh. Also #ifdefs innerhalb von Klassendefinition ist ganz schön pervers. Und dass der Returntyp von GetProcessTime &quot;const float&amp;&quot; statt &quot;float&quot; ist, find' ich auch komisch.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2113744</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2113744</guid><dc:creator><![CDATA[la_dida]]></dc:creator><pubDate>Fri, 02 Sep 2011 08:50:02 GMT</pubDate></item><item><title><![CDATA[Reply to Welcher STL Container zum sortierten Einfügen? on Fri, 02 Sep 2011 10:02:45 GMT]]></title><description><![CDATA[<p>Ich weis, habs grad geändert in:</p>
<pre><code class="language-cpp">inline const float &amp;GetProcessTime( void ) const { 
#ifdef _CLIENT
		return m_fProcessTime;
#else
		return 0.0f;
#endif
	}

	inline void SetProcessTime( const float &amp;time ) { 
#ifdef _CLIENT
		m_fProcessTime = time; 
#endif
	}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2113775</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2113775</guid><dc:creator><![CDATA[RedPuma]]></dc:creator><pubDate>Fri, 02 Sep 2011 10:02:45 GMT</pubDate></item><item><title><![CDATA[Reply to Welcher STL Container zum sortierten Einfügen? on Fri, 02 Sep 2011 10:09:44 GMT]]></title><description><![CDATA[<p>RedPuma schrieb:</p>
<blockquote>
<p>Ich weis, habs grad geändert in:</p>
</blockquote>
<p>Jetzt hast du es durch etwas Schlimmeres ersetzt. Als Nicht-Client kann man die Methoden zwar benutzen, aber sie bewirken nichts. Stell dir mal vor, das Makro wird versehentlich nicht mehr definiert. Ob das wohl so schnell jemand bemerkt?</p>
<p>Außerdem solltest du den Wert nicht per Referenz zurückgeben. Darf man das mit dem Literal überhaupt?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2113777</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2113777</guid><dc:creator><![CDATA[TyRoXx]]></dc:creator><pubDate>Fri, 02 Sep 2011 10:09:44 GMT</pubDate></item><item><title><![CDATA[Reply to Welcher STL Container zum sortierten Einfügen? on Fri, 02 Sep 2011 10:50:45 GMT]]></title><description><![CDATA[<p>Du hast recht. Habs wieder zurückgeändert, dann spuckt mir der Compiler wenigstens Fehler aus falls man die Methode im Server benutzen will.</p>
<p>Achso was soll an &quot;const float&amp;&quot; ungewöhnlich sein? Will nur unnützes Kopieren verhindern. Mag sein dass der Compiler das auch so optimieren würde aber ich gehe lieber sicher, gerade weil die Methode durch die Aufrufe innerhalb der priority_queue hunderte mal pro Sekunde benutzt wird. Und da will ich sicher sein dass alles korrekt, vorsicht Denglisch, ge-inlined wird.</p>
<p>Mal ne Frage nebenbei, bei Visual Studio 2010, werden da Funktionen mit __forceinline auch im Debug-Build inlined obwohl Inlining da deaktiviert ist? Gibt son paar Sachen in meiner Mathe-Bib die ich gerne auch im Debug inlinen würde.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2113795</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2113795</guid><dc:creator><![CDATA[RedPuma]]></dc:creator><pubDate>Fri, 02 Sep 2011 10:50:45 GMT</pubDate></item><item><title><![CDATA[Reply to Welcher STL Container zum sortierten Einfügen? on Fri, 02 Sep 2011 10:59:24 GMT]]></title><description><![CDATA[<p>RedPuma schrieb:</p>
<blockquote>
<p>Achso was soll an &quot;const float&amp;&quot; ungewöhnlich sein? Will nur unnützes Kopieren verhindern. Mag sein dass der Compiler das auch so optimieren würde aber ich gehe lieber sicher, gerade weil die Methode durch die Aufrufe innerhalb der priority_queue hunderte mal pro Sekunde benutzt wird. Und da will ich sicher sein dass alles korrekt, vorsicht Denglisch, ge-inlined wird.</p>
<p>Mal ne Frage nebenbei, bei Visual Studio 2010, werden da Funktionen mit __forceinline auch im Debug-Build inlined obwohl Inlining da deaktiviert ist? Gibt son paar Sachen in meiner Mathe-Bib die ich gerne auch im Debug inlinen würde.</p>
</blockquote>
<p>Referenzen gibt es auch nicht umsonst, daher ist die Rück- bzw. Übergabe von integrierten Typen per Referenz aus Performancegründen nicht sinnvoll. Genauso wie das Benutzen von <code>inline</code> . Das <code>inline</code> Schlüsselwort solltest Du eigentlich fast nie brauchen, ausser um bei Funktionen die ODR nicht zu verletzen.<br />
Im Allgemeinen soltlest Du Dich entspannen und den Compiler machen lassen. Der ist im Optimieren sehr gut und weiß viel besser als Du was zu tun ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2113805</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2113805</guid><dc:creator><![CDATA[brotbernd]]></dc:creator><pubDate>Fri, 02 Sep 2011 10:59:24 GMT</pubDate></item><item><title><![CDATA[Reply to Welcher STL Container zum sortierten Einfügen? on Fri, 02 Sep 2011 11:03:54 GMT]]></title><description><![CDATA[<p>brotbernd schrieb:</p>
<blockquote>
<p>Der ist im Optimieren sehr gut und weiß viel besser als Du was zu tun ist.</p>
</blockquote>
<p>Das will ich hoffen.</p>
<p>Könntest du auf die Performance bei Referenzen-Übergabe nochmal genauer eingehen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2113808</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2113808</guid><dc:creator><![CDATA[RedPuma]]></dc:creator><pubDate>Fri, 02 Sep 2011 11:03:54 GMT</pubDate></item><item><title><![CDATA[Reply to Welcher STL Container zum sortierten Einfügen? on Fri, 02 Sep 2011 11:30:52 GMT]]></title><description><![CDATA[<p>RedPuma schrieb:</p>
<blockquote>
<p>brotbernd schrieb:</p>
<blockquote>
<p>Der ist im Optimieren sehr gut und weiß viel besser als Du was zu tun ist.</p>
</blockquote>
<p>Das will ich hoffen.</p>
<p>Könntest du auf die Performance bei Referenzen-Übergabe nochmal genauer eingehen?</p>
</blockquote>
<p>Referenzen sind auf niedriger Ebene nichts anderes als Zeiger (sie sind C++ Syntax-Sugar um Operatorenüberladung netter implementieren zu können).</p>
<p>Dh. wenn du auf einen Wert hinter einer Referenz zugreifst, muss der auch erstmal dereferenziert werden, was aber auch nur bei primitiven Typen nen Unterschied macht.</p>
<p>Im Endeffekt ist es praktisch egal, gewöhn dir einfach an alles was in kein Register passt per Referenz zurückzugeben, den Rest per Value.<br />
Float passt super in ein Register, also ist die Rückgabe per const reference Schwachsinn.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2113825</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2113825</guid><dc:creator><![CDATA[Ethon_asguest]]></dc:creator><pubDate>Fri, 02 Sep 2011 11:30:52 GMT</pubDate></item><item><title><![CDATA[Reply to Welcher STL Container zum sortierten Einfügen? on Fri, 02 Sep 2011 11:33:32 GMT]]></title><description><![CDATA[<p>Eine Referenz ist im Prinzip das gleiche wie ein Zeiger. D.h., übergibst du eine Referenz oder einen Zeiger wird da die Adresse des eigentlichen Objekts kopiert, vom Aufwand das gleiche wie ein int oder float oder anderen primitiven Typen zu kopieren. Allerdings hast du eben über einen Zeiger oder Referenz eine zusätzliche Indirektion.<br />
Wenn Deine Funktion vom Compiler geinlined wird, ist das eh alles egal. Da macht der Compiler sowieso was am besten ist. D.h. eine inline Funktion die eine Referenz auf ein float zurückgibt, wird wahrscheinlich am Ende einfach den Wert kopieren.<br />
D.h. primitive Typen immer per Wert übergeben oder zurückgeben (natürlich nicht, wenn er tatsächlich verändert werden soll). Bei Klasseninstanzen mit höherem Kopieraufwand, verwendet mann dann besser konstante Referenzen, wobei auch da der Compiler einiges machen darf (<a href="http://cpp-next.com/archive/2009/08/want-speed-pass-by-value/" rel="nofollow">http://cpp-next.com/archive/2009/08/want-speed-pass-by-value/</a>). Mit C++11 kommt dann noch die Möglichkeit der rvalue Referenz dazu.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2113827</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2113827</guid><dc:creator><![CDATA[brotbernd]]></dc:creator><pubDate>Fri, 02 Sep 2011 11:33:32 GMT</pubDate></item></channel></rss>