<?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[Container für ... ?]]></title><description><![CDATA[<p>Also, ich sollte mir vielleicht mal nen bisschen STL &quot;reinziehen&quot;. <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 />
Aber auf die Schnelle brauche ich erstmal nen Container für folgende Aufgabe.<br />
Zwei nicht gleiche Zeiger p und q gleichen Typ als Schlüssel und<br />
Ein weiterer Zeiger r als Wert.<br />
also std::map böte sich an.<br />
Allerdings ist der Schlüssel kein geordnetes Tupel, sondern ein ungeordnetes Tupel.<br />
Folgende Funktionen sollen möglichst effizient sein<br />
f(p;q) liefert zugehörigen Wert.<br />
f(p) liefert Liste zugehöriger Schlüssel q und Werte r</p>
<p>Ich hatte zwei Ideen.<br />
Erste Variante:<br />
Verwendung von std::map, wobei der key ein nach aufsteigender Adresse geordnetes Paar von Zeigern ist.<br />
f(p;q) würde normal funktionieren. Allerdings ist f(p) relativ aufwendig, wenn z.B. p der &quot;größte&quot; verwendete Zeiger ist. Sucht man auf einer unsortierten Liste sequenziell -&gt; O(n).<br />
Zweite variante, ich verwende wieder std::map mit geordneten tupeln als key. Allerdings speicher ich jeden möglichen Key in beiden Variationen. Die map enthält doppelt soviele keys aber gleiche Anzahl an values. einfüge-Operationen dauern doppelt solange und lösch-Operationen auch.<br />
Zusatzbemerkung:<br />
Außerdem muss ich die Daten (auf die r zeigt) noch nach einem weiteren Kriterium sortieren. Ich habe dafür ersteinmal ein set verwendet.</p>
<p>Welche Variante erste oder zweite erachtet ihr als sinnvoller, bzw. gibt es irgendeine Möglichkeit das besser oder anders zu lösen insbesondere unter Brücksichtigung der Zusatzbemerkung?<br />
Ich bin die ganze Zeit am rätseln.<br />
Danke für jede Wortmeldung. <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<br />
DDR-RAM</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/171339/container-für</link><generator>RSS for Node</generator><lastBuildDate>Thu, 17 Sep 2026 09:55:24 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/171339.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 24 Jan 2007 15:16:25 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Container für ... ? on Wed, 24 Jan 2007 15:16:25 GMT]]></title><description><![CDATA[<p>Also, ich sollte mir vielleicht mal nen bisschen STL &quot;reinziehen&quot;. <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 />
Aber auf die Schnelle brauche ich erstmal nen Container für folgende Aufgabe.<br />
Zwei nicht gleiche Zeiger p und q gleichen Typ als Schlüssel und<br />
Ein weiterer Zeiger r als Wert.<br />
also std::map böte sich an.<br />
Allerdings ist der Schlüssel kein geordnetes Tupel, sondern ein ungeordnetes Tupel.<br />
Folgende Funktionen sollen möglichst effizient sein<br />
f(p;q) liefert zugehörigen Wert.<br />
f(p) liefert Liste zugehöriger Schlüssel q und Werte r</p>
<p>Ich hatte zwei Ideen.<br />
Erste Variante:<br />
Verwendung von std::map, wobei der key ein nach aufsteigender Adresse geordnetes Paar von Zeigern ist.<br />
f(p;q) würde normal funktionieren. Allerdings ist f(p) relativ aufwendig, wenn z.B. p der &quot;größte&quot; verwendete Zeiger ist. Sucht man auf einer unsortierten Liste sequenziell -&gt; O(n).<br />
Zweite variante, ich verwende wieder std::map mit geordneten tupeln als key. Allerdings speicher ich jeden möglichen Key in beiden Variationen. Die map enthält doppelt soviele keys aber gleiche Anzahl an values. einfüge-Operationen dauern doppelt solange und lösch-Operationen auch.<br />
Zusatzbemerkung:<br />
Außerdem muss ich die Daten (auf die r zeigt) noch nach einem weiteren Kriterium sortieren. Ich habe dafür ersteinmal ein set verwendet.</p>
<p>Welche Variante erste oder zweite erachtet ihr als sinnvoller, bzw. gibt es irgendeine Möglichkeit das besser oder anders zu lösen insbesondere unter Brücksichtigung der Zusatzbemerkung?<br />
Ich bin die ganze Zeit am rätseln.<br />
Danke für jede Wortmeldung. <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<br />
DDR-RAM</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1216091</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1216091</guid><dc:creator><![CDATA[DDR-RAM]]></dc:creator><pubDate>Wed, 24 Jan 2007 15:16:25 GMT</pubDate></item><item><title><![CDATA[Reply to Container für ... ? on Wed, 24 Jan 2007 21:46:25 GMT]]></title><description><![CDATA[<p>Du kannst schon die von Dir beschriebenen erste Variante nehmen, ohne das f(p) dei Komplexität O(n) erreicht. Man kann auch ausnutzen das std::pair bereits über einen operator&lt; verfügt und der 0-Pointer 'kleiner' als jeder andere ist. Dann wäre dies eine Möglichkeit:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;map&gt;

class Egal {};

class Map
{
public:
    typedef std::pair&lt; Egal*, Egal* &gt; key_type;
    typedef int* mapped_type;
    typedef std::map&lt; key_type, mapped_type &gt; container_type;
    typedef container_type::iterator iterator;

    mapped_type&amp; f( key_type::first_type p, key_type::second_type q )
    {
        return m_map[ std::make_pair( p, q ) ];
    }

    std::pair&lt; iterator, iterator &gt; f( key_type::first_type p )
    {
        return std::make_pair( m_map.lower_bound( std::make_pair( p, key_type::second_type(0) ) ),
            m_map.upper_bound( std::make_pair( p+1, key_type::second_type(0) ) ) );
    }
private:
    container_type m_map;
};

int main()
{
    using namespace std;
    Egal a,b, a1, b2, b3;
    int i1 = 1;
    int i2 = 2;
    int i3 = 3;
    Map m;
    m.f( &amp;b, &amp;b3 ) = &amp;i3;
    m.f( &amp;a, &amp;a1 ) = &amp;i1;
    m.f( &amp;b, &amp;b2 ) = &amp;i2;
    std::pair&lt; Map::iterator, Map::iterator &gt; erg = m.f( &amp;b );
    for( Map::iterator i = erg.first; i != erg.second; ++i )
    {
        cout &lt;&lt; &quot;Wert: &quot; &lt;&lt; *(i-&gt;second) &lt;&lt; endl;
    }
    return 0;
}
</code></pre>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1216462</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1216462</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Wed, 24 Jan 2007 21:46:25 GMT</pubDate></item><item><title><![CDATA[Reply to Container für ... ? on Wed, 24 Jan 2007 23:25:44 GMT]]></title><description><![CDATA[<p>Problem ist nur, dass das ganze, so wie du das aufgeschrieben hast für geordnete Paare funktioniert. Aber die Reihenfolge kann für mich keine Rolle spielen und ist von daher egal. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /><br />
assert(f(p;q) == f(q;p));<br />
Ebenso die andere funktion f(p). p könnte sowohl first als auch second sein.</p>
<pre><code class="language-cpp">mapped_type&amp; f( key_type::first_type p, key_type::second_type q )
    {
        return m_map[ std::make_pair( std::min( p, q ), std::max( p, q ) ) ];
    }
</code></pre>
<p>In der anderen Funktion geht dann das suchen los, weil die von dir vorgeschlagene Variante nur funktioniert, wenn p first ist. Aber p kann auch als second auftreten. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
<p>Trotzdem danke für die Antwort. (Ich muss mich mehr mit der STL und Boost befassen, die Syntax bereitet Freude)</p>
<p>MfG<br />
DDR-RAM</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1216514</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1216514</guid><dc:creator><![CDATA[DDR-RAM]]></dc:creator><pubDate>Wed, 24 Jan 2007 23:25:44 GMT</pubDate></item><item><title><![CDATA[Reply to Container für ... ? on Wed, 24 Jan 2007 23:35:21 GMT]]></title><description><![CDATA[<p>wie wärs mit boost::multi_index_container?</p>
<pre><code class="language-cpp">struct Value
{
    T* p;
    T* q;
    T* r;
};
typedef multi_index_container&lt;
  Value,
  indexed_by&lt;
    ordered_non_unique&lt;member&lt;Value,T*,&amp;Value::p&gt;,
    ordered_non_unique&lt;member&lt;Value,T*,&amp;Value::q&gt; &gt;
  &gt; 
&gt; Container;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1216518</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1216518</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Wed, 24 Jan 2007 23:35:21 GMT</pubDate></item><item><title><![CDATA[Reply to Container für ... ? on Wed, 24 Jan 2007 23:39:22 GMT]]></title><description><![CDATA[<p>Der Name ist gut, ob er hält, was er verspricht werde ich mal am nachmittag oder so feststellen. jetzt geh ich erstmal schlafen. thx.</p>
<p>MfG<br />
DDR-RAM</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1216522</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1216522</guid><dc:creator><![CDATA[DDR-RAM]]></dc:creator><pubDate>Wed, 24 Jan 2007 23:39:22 GMT</pubDate></item></channel></rss>