<?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[Referenz-Counting von Farbpaaren]]></title><description><![CDATA[<p>Hallo.</p>
<p>Ich benutze ncurses und da muss man mit init_pair() einen short als Identifier für ein Farbpaar(fg, bg) definieren. Das ganze wollte ich c++ig machen. Und das hab ich gemacht, aber ich finde die Lösung nicht top. Vielleicht die falsche Datenstruktur ausgewählt? Wenn ja, welche wäre denn adäquater? Ich mach einmal for-Schleife und dann (falls keine ID vorhanden ist) immer doppelte for-Schleife. Das Ganze scheint mir etwas merkwürdig, normalerweise müsste man das doch performanter hinbekommen. Ich will mal Code zeigen:</p>
<pre><code class="language-cpp">struct color_type{
        static std::vector&lt;std::pair&lt;color_pair, short&gt;&gt; ids;

        color_pair cp;
        short id;

        static short get_id(color_pair c){
            for(const auto&amp; id : ids){
                if(id.first == c)
                    return id.second;
            }

            for(short value{1}; value!=std::numeric_limits&lt;short&gt;::max(); ++value){
                if(std::find_if(ids.begin(), ids.end(), [value](const std::pair&lt;color_pair, short&gt;&amp; v){
                    return v.second == value;
                }) == ids.end())
                {
                    init_pair(value, (short)c.foreground, (short)c.background);
                    return value;
                }
            }

            throw std::runtime_error{&quot;No space left for color pair&quot;};
        }

    public:
        color_type(color_pair c)
            : cp{c}, id{get_id(c)} {}
    };
</code></pre>
<p>Der Code funktioniert natürlich. Aber was mach ich denn sonst noch falsch?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/340272/referenz-counting-von-farbpaaren</link><generator>RSS for Node</generator><lastBuildDate>Sat, 11 Apr 2026 08:35:56 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/340272.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 28 Oct 2016 21:20:15 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Referenz-Counting von Farbpaaren on Fri, 28 Oct 2016 21:20:15 GMT]]></title><description><![CDATA[<p>Hallo.</p>
<p>Ich benutze ncurses und da muss man mit init_pair() einen short als Identifier für ein Farbpaar(fg, bg) definieren. Das ganze wollte ich c++ig machen. Und das hab ich gemacht, aber ich finde die Lösung nicht top. Vielleicht die falsche Datenstruktur ausgewählt? Wenn ja, welche wäre denn adäquater? Ich mach einmal for-Schleife und dann (falls keine ID vorhanden ist) immer doppelte for-Schleife. Das Ganze scheint mir etwas merkwürdig, normalerweise müsste man das doch performanter hinbekommen. Ich will mal Code zeigen:</p>
<pre><code class="language-cpp">struct color_type{
        static std::vector&lt;std::pair&lt;color_pair, short&gt;&gt; ids;

        color_pair cp;
        short id;

        static short get_id(color_pair c){
            for(const auto&amp; id : ids){
                if(id.first == c)
                    return id.second;
            }

            for(short value{1}; value!=std::numeric_limits&lt;short&gt;::max(); ++value){
                if(std::find_if(ids.begin(), ids.end(), [value](const std::pair&lt;color_pair, short&gt;&amp; v){
                    return v.second == value;
                }) == ids.end())
                {
                    init_pair(value, (short)c.foreground, (short)c.background);
                    return value;
                }
            }

            throw std::runtime_error{&quot;No space left for color pair&quot;};
        }

    public:
        color_type(color_pair c)
            : cp{c}, id{get_id(c)} {}
    };
</code></pre>
<p>Der Code funktioniert natürlich. Aber was mach ich denn sonst noch falsch?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2513285</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2513285</guid><dc:creator><![CDATA[mimsi]]></dc:creator><pubDate>Fri, 28 Oct 2016 21:20:15 GMT</pubDate></item><item><title><![CDATA[Reply to Referenz-Counting von Farbpaaren on Sun, 30 Oct 2016 08:44:25 GMT]]></title><description><![CDATA[<p><code>$thread.top();</code></p>
<p>Irgendein Kommentar zu meinem Code?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2513390</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2513390</guid><dc:creator><![CDATA[mimsi]]></dc:creator><pubDate>Sun, 30 Oct 2016 08:44:25 GMT</pubDate></item><item><title><![CDATA[Reply to Referenz-Counting von Farbpaaren on Sun, 30 Oct 2016 09:14:24 GMT]]></title><description><![CDATA[<p>Verstehe ich das richtig, daß es keine doppelten Identifier ('value')-Einträge geben soll?<br />
Warum verwendest du dann keine std::map bzw. bimap, wie z.B. <a href="https://dieboostcppbibliotheken.de/boost.bimap" rel="nofollow">Boost.Bimap</a>?</p>
<p>Ich persönlich würde mir auch einfach den höchsten Identifier einmalig heraussuchen (und in einer Membervariablen merken) und dann einfach diesen Index erhöhen (wenn du dann mehr als numeric_limits&lt;short&gt;::max() Werte benötigst, dann hast du sowieso ein Problem).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2513395</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2513395</guid><dc:creator><![CDATA[Th69]]></dc:creator><pubDate>Sun, 30 Oct 2016 09:14:24 GMT</pubDate></item><item><title><![CDATA[Reply to Referenz-Counting von Farbpaaren on Sun, 30 Oct 2016 09:16:02 GMT]]></title><description><![CDATA[<p>mimsi schrieb:</p>
<blockquote>
<p><code>$thread.top();</code></p>
<p>Irgendein Kommentar zu meinem Code?</p>
</blockquote>
<p>Wieso &quot;natürlich&quot;? Wieso &quot;falsch&quot;? Du sagst nicht, was genau das alles soll, wieso du es nicht top findest usw., verlangst aber, dass jemand sich im Kaffeesatzlesen versucht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2513397</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2513397</guid><dc:creator><![CDATA[NO_TROLL]]></dc:creator><pubDate>Sun, 30 Oct 2016 09:16:02 GMT</pubDate></item><item><title><![CDATA[Reply to Referenz-Counting von Farbpaaren on Sun, 30 Oct 2016 09:23:41 GMT]]></title><description><![CDATA[<p>Th69 schrieb:</p>
<blockquote>
<p>Verstehe ich das richtig, daß es keine doppelten Identifier ('value')-Einträge geben soll?<br />
Warum verwendest du dann keine std::map bzw. bimap, wie z.B. <a href="https://dieboostcppbibliotheken.de/boost.bimap" rel="nofollow">Boost.Bimap</a>?</p>
</blockquote>
<p>Ja, könnt ich machen, müsste dann trotzdem aber noch über alle Einträge iterieren, um eine freie ID zu bekommen oder nicht? Wobei, die ID's werden sowieso bis zum Programm-Ende nicht mehr aus der Liste rausgeholt, ergo ich kann einfach <code>map.size()</code> zur Identifizierung nutzen, gut.</p>
<blockquote>
<p>Ich persönlich würde mir auch einfach den höchsten Identifier einmalig heraussuchen (und in einer Membervariablen merken) und dann einfach diesen Index erhöhen (wenn du dann mehr als numeric_limits&lt;short&gt;::max() Werte benötigst, dann hast du sowieso ein Problem).</p>
</blockquote>
<p>Stimmt. Ich mach einfach HOECHSTER_WERT*HOECHSTER_WERT.</p>
<blockquote>
<p>Wieso &quot;natürlich&quot;? Wieso &quot;falsch&quot;?</p>
</blockquote>
<p>Weder noch.</p>
<blockquote>
<p>Du sagst nicht, was genau das alles soll</p>
</blockquote>
<p>Steht im Titel</p>
<blockquote>
<p>wieso du es nicht top findest usw.</p>
</blockquote>
<p>Sagte ich schon. Zu viele for-Schleifen für meinen Geschmack.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2513399</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2513399</guid><dc:creator><![CDATA[mimsi]]></dc:creator><pubDate>Sun, 30 Oct 2016 09:23:41 GMT</pubDate></item></channel></rss>