<?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[map mit arrays ?]]></title><description><![CDATA[<p>Hallo Leute,</p>
<p>Folgendes Problem, bei dem ich nicht weiterkomme.</p>
<p>Für n Identitäten (id) möchte ich 2 Arrays gleicher Art und Größe haben.<br />
Die Relation Identität zu Objekt (hier das Array) erfolgt einfacherweise in einer Map.</p>
<p>Um die map am Anfang zu definieren, wollte ich es so etwa machen:</p>
<pre><code class="language-cpp">for (id=0 ; id&lt;MAX ; id++)
{
   int array_a[3];
   int array_b[3];

   array_a_map.insert(make_pair(id, &amp;array_a));
   array_b_map.insert(make_pair(id, &amp;array_b));
}
</code></pre>
<p>Später könnte ich mir die Pointer zurückgeben lassen, die immer auf das erste Element der Arrays zeigen und damit dann arbeiten.</p>
<p>Jedoch wird die Inititlisierung so wohl nicht funktionieren, da ich die Array Adressen in der Map speichere. Bei nur einer id würde es funktionieren, beim weiteren for-Durchlauf wird doch wieder dieselbe Adresse geschrieben oder? Wäre also Mist.</p>
<p>Wie könnte man es sonst machen? Map von Map vielleicht? Die zweite Map wäre dann das Array.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/262733/map-mit-arrays</link><generator>RSS for Node</generator><lastBuildDate>Sun, 06 Sep 2026 08:37:46 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/262733.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 10 Mar 2010 15:19:02 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to map mit arrays ? on Wed, 10 Mar 2010 15:19:02 GMT]]></title><description><![CDATA[<p>Hallo Leute,</p>
<p>Folgendes Problem, bei dem ich nicht weiterkomme.</p>
<p>Für n Identitäten (id) möchte ich 2 Arrays gleicher Art und Größe haben.<br />
Die Relation Identität zu Objekt (hier das Array) erfolgt einfacherweise in einer Map.</p>
<p>Um die map am Anfang zu definieren, wollte ich es so etwa machen:</p>
<pre><code class="language-cpp">for (id=0 ; id&lt;MAX ; id++)
{
   int array_a[3];
   int array_b[3];

   array_a_map.insert(make_pair(id, &amp;array_a));
   array_b_map.insert(make_pair(id, &amp;array_b));
}
</code></pre>
<p>Später könnte ich mir die Pointer zurückgeben lassen, die immer auf das erste Element der Arrays zeigen und damit dann arbeiten.</p>
<p>Jedoch wird die Inititlisierung so wohl nicht funktionieren, da ich die Array Adressen in der Map speichere. Bei nur einer id würde es funktionieren, beim weiteren for-Durchlauf wird doch wieder dieselbe Adresse geschrieben oder? Wäre also Mist.</p>
<p>Wie könnte man es sonst machen? Map von Map vielleicht? Die zweite Map wäre dann das Array.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1867057</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1867057</guid><dc:creator><![CDATA[se1111]]></dc:creator><pubDate>Wed, 10 Mar 2010 15:19:02 GMT</pubDate></item><item><title><![CDATA[Reply to map mit arrays ? on Wed, 10 Mar 2010 15:24:40 GMT]]></title><description><![CDATA[<p>Ich kann dir nicht ganz folgen, fürchte ich. Abgesehen davon speicherst du Adressen eines Arrays, das nach Verlassen der for-Schleife überhaupt nicht mehr existiert. Was genau hast du denn vor?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1867063</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1867063</guid><dc:creator><![CDATA[DocShoe]]></dc:creator><pubDate>Wed, 10 Mar 2010 15:24:40 GMT</pubDate></item><item><title><![CDATA[Reply to map mit arrays ? on Wed, 10 Mar 2010 15:35:56 GMT]]></title><description><![CDATA[<p>stimmt, die Arrays müssten natürlich global sein um dauerhaft zu existieren.<br />
Allerdings müssen sie sich ja irgendwie bei jedem Id Durchlauf unterscheiden lassen, um sie in der Map eindeutig zuzuweisen.</p>
<p>Den Typ der Map wollte ich so setzen:<br />
typedef std::map&lt;int, int*&gt; ArrayMapType</p>
<p>Ich sehe aber nicht wie ich sie unterscheiden sollte.</p>
<p>Besser das Ganze über eine<br />
std::map&lt;int, map&lt;int, int&gt;&gt;<br />
machen !? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1867069</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1867069</guid><dc:creator><![CDATA[se1111]]></dc:creator><pubDate>Wed, 10 Mar 2010 15:35:56 GMT</pubDate></item><item><title><![CDATA[Reply to map mit arrays ? on Wed, 10 Mar 2010 15:44:39 GMT]]></title><description><![CDATA[<p>Beschreib´ doch bitte mal ganz genau das Gesamtvorhaben. Man kann bestenfalls vermuten, was du vorhast, zumindest ich habe keine Ahnung, welche Adressen du wann wie wiederfinden willst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1867074</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1867074</guid><dc:creator><![CDATA[DocShoe]]></dc:creator><pubDate>Wed, 10 Mar 2010 15:44:39 GMT</pubDate></item><item><title><![CDATA[Reply to map mit arrays ? on Wed, 10 Mar 2010 15:57:11 GMT]]></title><description><![CDATA[<p>se1111 schrieb:</p>
<blockquote>
<p>Wie könnte man es sonst machen? Map von Map vielleicht? Die zweite Map wäre dann das Array.</p>
</blockquote>
<p>Ich würde es (wenn ich den dein Problem richtig verstehe) wohl auf eine der folgenden Weisen umsetzen:</p>
<p>std::map&lt;int, std::vector&lt;int&gt; &gt;<br />
std::map&lt;int, std::tr1::array&lt;int, 3&gt; &gt;</p>
<p>Ein Array durch eine map zu ersetzen sehe ich als falsch an, da würde ich auf entweder einen vector oder dem array aus dem TR1 zurückgreifen, da diese einem Array noch am meisten ähneln.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1867081</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1867081</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Wed, 10 Mar 2010 15:57:11 GMT</pubDate></item><item><title><![CDATA[Reply to map mit arrays ? on Wed, 10 Mar 2010 16:09:49 GMT]]></title><description><![CDATA[<p>OK hier noch etwas genauer:</p>
<p>Ich habe diese zwei Arrays:<br />
int array_a[3];<br />
int array_b[3];</p>
<p>Normalerweise schreibe und lese ich direkt mit z.B.<br />
array_a[0] = 0x10;</p>
<p>Da ich nun n verschiedene Kontexte habe (Identitäten genannt), kann in jeder Identität der Inhalt der Arrays anders sein. Und sie gibt es dann auch n-mal (für jede Id).<br />
Ich muss also über eine Id&lt;-&gt;Array Relation drauf zugreifen. Ich denke eine map ist dafür geeignet. Der Index ist die Id, der Content ist ein &quot;Pointer auf Array&quot;.<br />
Insgesamt habe ich also auch 2 maps, &quot;array_a_map&quot; und &quot;array_b_map&quot;.</p>
<pre><code class="language-cpp">typedef std::map&lt;int, int*&gt; ArrayMapType;

// Funktion die mir den Pointer zurückgibt:
int * GetPtr2ArrayfromIdMap(int id, ArrayMapType map_name)
{
  ArrayMapType::iterator iter = map_name.begin();

  iter = map_name.find(id);
  if( iter != map_name.end() ) 
    return iter-&gt;second;
}
</code></pre>
<pre><code class="language-cpp">// Array Zugriff (Lesen):

  int * tmpArrayPtr = GetPtr2ArrayfromIdMap(id, array_a_map); // get Ptr to Array
  int tmp__0 = *(tmpArrayPtr);   // points to tmpArrayPtr[0]  
  int tmp__1 = *(tmpArrayPtr+1); // points to tmpArrayPtr[1]
</code></pre>
<p>Die Frage ist nun, wie ich initial die map aufsetze. Ich müsste für jede map und für jede Id ein 3 dimensionales Array reservieren. Dafür brauche ich die jeweiligen Adressen der Arrays, und<br />
diese müssen bei jedem for-Durchlauf (siehe oben) eindeutig sein. Ich muss also die Arrays unterscheiden können. Da sie aber immer gleich heißen, sind sie auch immer dieselben Objekte.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1867085</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1867085</guid><dc:creator><![CDATA[se1111]]></dc:creator><pubDate>Wed, 10 Mar 2010 16:09:49 GMT</pubDate></item><item><title><![CDATA[Reply to map mit arrays ? on Wed, 10 Mar 2010 16:51:33 GMT]]></title><description><![CDATA[<p>se1111 schrieb:</p>
<blockquote>
<p>OK hier noch etwas genauer:</p>
</blockquote>
<p>Ehrlich gesagt bin ich von deiner Erläuterung eher verwirrt als was anderes.</p>
<p>Wenn die Arrays pro Id einen eigenen Inhalt haben müssen, ist meine Variante die richtige (Ansonsten müsstest du die Arrays dynamisch allozieren oder n-mal global definieren, wobei sich n nicht zur Laufzeit unterscheiden kann).</p>
<p>Meine Variante:</p>
<pre><code class="language-cpp">#include &lt;array&gt; // tr1-Header
#include &lt;map&gt;

int main()
{
    std::map&lt;int, std::tr1::array&lt;int, 3&gt; &gt; identityArray;

    // Beispiel für den schreibenden Zugriff auf ein Arrayelement zur Id 4711
    identityAArray[4711][0] = 41;
    //             \Id/  |
    //                   |
    //             Arrayposition

    // Beispiel für den lesenden Zugriff auf ein Arrayelement zur Id 4711
    std::cout &lt;&lt; identityAArray[4711][0];
}
</code></pre>
<pre><code>Was passiert beim Indexzugriff auf diese Map:
a) Existiert zu dem Key schon ein Element?
   =&gt; ja siehe c
   =&gt; nein siehe b
b) Ein neues array&lt;int, 3&gt; (Int-Array mit 3 defaultinitialisierten [bei int: 0]
   Einträgen) wird angelegt und in die Map zum Key abgelegt.
   =&gt; weiter mit c
c) Rückgabe einer Referenz auf den Inhalt (Hier dem Array).
</code></pre>
<p>Falls das nicht gewünscht ist: Abfrage mit find ob das Element existiert, und Zugriff per Iteratoren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1867101</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1867101</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Wed, 10 Mar 2010 16:51:33 GMT</pubDate></item><item><title><![CDATA[Reply to map mit arrays ? on Thu, 11 Mar 2010 08:35:53 GMT]]></title><description><![CDATA[<p>Danke, werde ich mal versuchen. Allerdings habe ich hier VC++ 6.0 und ob es da die TR1 gibt, bin ich mir grad nicht sicher.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1867326</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1867326</guid><dc:creator><![CDATA[se1111]]></dc:creator><pubDate>Thu, 11 Mar 2010 08:35:53 GMT</pubDate></item><item><title><![CDATA[Reply to map mit arrays ? on Thu, 11 Mar 2010 09:50:04 GMT]]></title><description><![CDATA[<p>se1111 schrieb:</p>
<blockquote>
<p>Allerdings habe ich hier VC++ 6.0</p>
</blockquote>
<p>Warum?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1867360</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1867360</guid><dc:creator><![CDATA[Michael E.]]></dc:creator><pubDate>Thu, 11 Mar 2010 09:50:04 GMT</pubDate></item><item><title><![CDATA[Reply to map mit arrays ? on Thu, 11 Mar 2010 10:12:53 GMT]]></title><description><![CDATA[<p>se1111 schrieb:</p>
<blockquote>
<p>Danke, werde ich mal versuchen. Allerdings habe ich hier VC++ 6.0 und ob es da die TR1 gibt, bin ich mir grad nicht sicher.</p>
</blockquote>
<p>VC++6? Ne, der hat kein TR1. Das hat ja noch nichmal richtiges C++.</p>
<p>Mit anderen Worten: 1997 hat angerufen und will seinen Compiler zurück <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1867369</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1867369</guid><dc:creator><![CDATA[CptC]]></dc:creator><pubDate>Thu, 11 Mar 2010 10:12:53 GMT</pubDate></item><item><title><![CDATA[Reply to map mit arrays ? on Thu, 11 Mar 2010 10:31:21 GMT]]></title><description><![CDATA[<p>se1111 schrieb:</p>
<blockquote>
<p>Allerdings habe ich hier VC++ 6.0 und ob es da die TR1 gibt, bin ich mir grad nicht sicher.</p>
</blockquote>
<p>Nein, gibt es nicht. Dann ist der Weg etwas umständlicher, aber mit std::vector dennoch machbar.</p>
<p>Dennoch die schon hier gestellte Frage: Warum VC++ 6.0? Sofern dir dies nicht durch eine Firma vorgegeben wurde rate ich dir ganz dringend zu einem Wechsel auf eine aktuelle Plattform (z.B. Visual C++ 2008 Express).</p>
<p>Der VC++ 6.0 hat etliche Probleme mit dem C++ Standard (logisch, der C++ Standard kam etwas danach raus).</p>
<p>Aber um auf die Alternativen zurück zu kommen:</p>
<pre><code class="language-cpp">#include &lt;map&gt;
#include &lt;vector&gt;

int main()
{
    std::map&lt;int, std::vector&lt;int&gt; &gt; identityArray;

    // Beim ersten Zugriff auf Id den vector für drei Elemente initialisieren:
    identityArray[4711] = std::vector&lt;int&gt;(3);

    // Rest läuft identisch, nur muss sichergestellt sein, das vor dem Zugriff
    // auf den jeweiligen vector über den Indexoperator dieser schon drei
    // Elemente enthält (Ein Standardkonstruierter vector enthält anfangs 0
    // Elemente).
    ...
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1867375</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1867375</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Thu, 11 Mar 2010 10:31:21 GMT</pubDate></item><item><title><![CDATA[Reply to map mit arrays ? on Fri, 12 Mar 2010 10:22:38 GMT]]></title><description><![CDATA[<p>Genau ich muss ihm die Sachen reservieren. Das war das Problem wo ich nicht sicher war.</p>
<p>asc schrieb:</p>
<blockquote>
<p>// Beim ersten Zugriff auf Id den vector für drei Elemente initialisieren:<br />
identityArray[4711] = std::vector&lt;int&gt;(3);</p>
</blockquote>
<p>Ich hoff ich verstehe es richtig, dann müsste ich das ja so schreiben:</p>
<pre><code class="language-cpp">for (..Identity.. )
{
  array_a_map.insert(make_pair(Identity, std::vector&lt;int&gt;(3)));

}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1867846</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1867846</guid><dc:creator><![CDATA[se1111]]></dc:creator><pubDate>Fri, 12 Mar 2010 10:22:38 GMT</pubDate></item><item><title><![CDATA[Reply to map mit arrays ? on Fri, 12 Mar 2010 12:03:14 GMT]]></title><description><![CDATA[<p>se1111 schrieb:</p>
<blockquote>
<p>Genau ich muss ihm die Sachen reservieren.</p>
</blockquote>
<p>Nein, DU musst die Sachen nicht zwangsweise reservieren. Zumindest wenn du mit Objekten arbeitest, die eben diese Aufgabe für dich übernehmen. Und ein Standardkonstruiertes std::tr1::array&lt;int, 3&gt; wäre für dich als Mapelement eigentlich genau richtig (Ist aber nicht extrem veralteten VC++ 6.0 enthalten).</p>
<p>Die Map stellt bereits eine Initialisierung mit dem Standardkonstruktor sicher. Sofern du den Indexoperator verwendest, ist Sichergestellt das ein entsprechendes Objekt bereits existiert. Nur muss man 3 Fälle unterscheiden:<br />
a) Ein Standardkonstruierter Zeiger bringt dir hier keinen Nutzen.<br />
b) Ein Standardkonstruiertes std::tr1::array&lt;int, 3&gt; ist eine Arrayklasse mit 3 int-Werten (Im wesentlichen ein Wrapper um ein C-Array).<br />
c) Ein Standardkonstruiertes std::vector ist ein vector mit 0 Elementen. Da du 3 benötigst musst du selbst sicherstellen das die beim lesenden Zugriff auch enthalten sind. Dies geht entweder durch eine Zuweisung mit einem entsprechenden Vector, oder ein resize...</p>
<p>se1111 schrieb:</p>
<blockquote>
<p>Ich hoff ich verstehe es richtig, dann müsste ich das ja so schreiben:</p>
<pre><code class="language-cpp">for (..Identity.. )
{
  array_a_map.insert(make_pair(Identity, std::vector&lt;int&gt;(3)));

}
</code></pre>
</blockquote>
<p>Kürzer Wäre:</p>
<pre><code class="language-cpp">for (..Identity.. )
{
  array_a_map[Identity] = std::vector&lt;int&gt;(3);
  // ODER
  array_a_map[Identity].resize(3);
}
</code></pre>
<p>Bei verwendung eines neuen Compilers mit der TR1 Unterstützung kannst du dir diesen Schritt gänzlich schenken (wie gesagt std::tr1::array).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1867926</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1867926</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Fri, 12 Mar 2010 12:03:14 GMT</pubDate></item><item><title><![CDATA[Reply to map mit arrays ? on Fri, 12 Mar 2010 12:05:27 GMT]]></title><description><![CDATA[<p>Vielleicht noch ein letztes: In C++ ist es nicht unüblich das man die Speicherverwaltung Klassen überlässt die es intern behandeln (z.B. die Containerklassen der STL).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1867928</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1867928</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Fri, 12 Mar 2010 12:05:27 GMT</pubDate></item></channel></rss>