<?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[Elemente einfuegen in vector bzw. map]]></title><description><![CDATA[<p>Hi, ich hab ein etwas groesseres dreidimensionales Array an Daten, das ich durch Verschachtelung von STL-Containern darstellen moechte. Der Grund ist: die Unterraeume sind nicht fuer jeden Parameter gleich gross, und einer meiner drei Koeffizienten ist nicht ganzzahlig. Meine Idee war etwa folgendes:</p>
<pre><code class="language-cpp">typedef map,double, double&gt; D2D;
typedef vector&lt;D2D&gt; I2D2D;
typedef vector&lt;I2D2D&gt; I2I2D2D;

I2I2D2D register;

void fill_register()
{
 register[0][1][1.5] = 2.3;
 register[1][2][1.6] = 12.54;
 // usw.
}
</code></pre>
<p>leider gibts schon bei der ersten Zuweisung eine Segmentation violation. Muss ich da erst irgendwelche Initialisierungen vornehmen? Dachte immer, dass vector und map in so nem Fall sich den noetigen Speicher besorgen.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/187158/elemente-einfuegen-in-vector-bzw-map</link><generator>RSS for Node</generator><lastBuildDate>Thu, 24 Sep 2026 14:37:32 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/187158.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 16 Jul 2007 13:37:07 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Elemente einfuegen in vector bzw. map on Mon, 16 Jul 2007 13:37:07 GMT]]></title><description><![CDATA[<p>Hi, ich hab ein etwas groesseres dreidimensionales Array an Daten, das ich durch Verschachtelung von STL-Containern darstellen moechte. Der Grund ist: die Unterraeume sind nicht fuer jeden Parameter gleich gross, und einer meiner drei Koeffizienten ist nicht ganzzahlig. Meine Idee war etwa folgendes:</p>
<pre><code class="language-cpp">typedef map,double, double&gt; D2D;
typedef vector&lt;D2D&gt; I2D2D;
typedef vector&lt;I2D2D&gt; I2I2D2D;

I2I2D2D register;

void fill_register()
{
 register[0][1][1.5] = 2.3;
 register[1][2][1.6] = 12.54;
 // usw.
}
</code></pre>
<p>leider gibts schon bei der ersten Zuweisung eine Segmentation violation. Muss ich da erst irgendwelche Initialisierungen vornehmen? Dachte immer, dass vector und map in so nem Fall sich den noetigen Speicher besorgen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1326567</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1326567</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Mon, 16 Jul 2007 13:37:07 GMT</pubDate></item><item><title><![CDATA[Reply to Elemente einfuegen in vector bzw. map on Mon, 16 Jul 2007 14:29:12 GMT]]></title><description><![CDATA[<p>Map schon, Vector nicht. Du musst vorher den Vector mit resize(n) auf die entsprechende Größe bringen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1326572</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1326572</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Mon, 16 Jul 2007 14:29:12 GMT</pubDate></item><item><title><![CDATA[Reply to Elemente einfuegen in vector bzw. map on Mon, 16 Jul 2007 13:48:48 GMT]]></title><description><![CDATA[<p>okay, danke. ich werds mal versuchen. Stattdessen koennte ich auch map&lt;int, X&gt; an Stelle von vector&lt;X&gt; verwenden, oder?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1326582</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1326582</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Mon, 16 Jul 2007 13:48:48 GMT</pubDate></item><item><title><![CDATA[Reply to Elemente einfuegen in vector bzw. map on Mon, 16 Jul 2007 13:54:58 GMT]]></title><description><![CDATA[<p>Wenn du meinst, daß das einen Vorteil bringt <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="😉"
    /> (der Zugriff auf einen vector&lt;&gt; ist um einiges schneller als bei einer map&lt;&gt;)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1326589</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1326589</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Mon, 16 Jul 2007 13:54:58 GMT</pubDate></item><item><title><![CDATA[Reply to Elemente einfuegen in vector bzw. map on Tue, 17 Jul 2007 09:25:07 GMT]]></title><description><![CDATA[<p>Ich habs beim vector belassen, am anfang der fill methode ein resize() aufzurufen ist ja nicht soo schwer...</p>
<p>Jetzt ergibt sich mir allerdings ein anderes Problem. Ich habe mein &quot;Array&quot; wie folgt definiert und gefuellt:</p>
<pre><code class="language-cpp">//lumis.h

typedef map&lt;double, double&gt; P81ToLumiMap;
typedef vector&lt;P81ToLumiMap&gt; PythiaSetToPL;
typedef vector&lt;PythiaSetToPL&gt; PVersToSetToPL;

PVersToSetToPL lumis; // == vector&lt; vector&lt; map&lt;double, double&gt; &gt; &gt;

struct LumiFiller
{
public:
  LumiFiller() 
  { fill_lumis(); }

private:
 void fill_lumis()
  {    
    lumis.resize(nPytVers);
    for (int v = 0; v &lt; nPytVers; v++)
      { lumis[v].resize(nPytSets); }

    // Pythia64
    lumis[P64][DIRECT][1.9] = 68.50;
    lumis[P64][NOMPI][1.9]  = 81.62;

    lumis[P64][s000_033_066][1.1] = 1.71;
    lumis[P64][s000_033_066][1.2] = 2.10;
    lumis[P64][s000_033_066][1.3] = 2.51;
    lumis[P64][s000_033_066][1.4] = 2.92;
    lumis[P64][s000_033_066][1.5] = 3.34;
    lumis[P64][s000_033_066][1.6] = 3.73;
    lumis[P64][s000_033_066][1.7] = 4.11;
    // und viele Zeilen mehr in dieser Art
  }
};

LumiFiller a; //die Definition der Gobalen varibale sorgt uer den Aufruf von fill_lumis()
</code></pre>
<p>Wie man sieht habe ich im letzten Block als dritten index doubles in 0.1 er Schritten. Wenn ich jetzt mit Iteratoren mir den ganzen Kram ausgeben lasse, stimmt auch alles perfekt, aber folgendes funktioniert nicht:</p>
<pre><code class="language-cpp">for (double d = 1.1; d &lt;= 1.7; d += 0.1)
  {
    cout &lt;&lt; lumis[P64][s000_033_066][d] &lt;&lt; endl;
  }
</code></pre>
<p>fuer d = 1.1 und 1.2 gibt er noch richtige Werte aus, danach nur noch Nullen. Gibs hier etwas wieder Rundungsfehler oder aehnliches?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1327041</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1327041</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Tue, 17 Jul 2007 09:25:07 GMT</pubDate></item><item><title><![CDATA[Reply to Elemente einfuegen in vector bzw. map on Tue, 17 Jul 2007 09:29:20 GMT]]></title><description><![CDATA[<p>es ist ein problem mit der genauigkeit von double</p>
<p>lass dir doch mal die werte die die schleife generiert neben den werten, die die float notation generiert ausgeben - evtl gibt es da kleine unterschiede</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1327046</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1327046</guid><dc:creator><![CDATA[ronny]]></dc:creator><pubDate>Tue, 17 Jul 2007 09:29:20 GMT</pubDate></item><item><title><![CDATA[Reply to Elemente einfuegen in vector bzw. map on Tue, 17 Jul 2007 09:34:45 GMT]]></title><description><![CDATA[<p>hm leider kann ich zur Zeit kein setprecision nutzen - irgendwer hat da ne headerdatei zerschossen, der sysadmin sitzt grad dran. Die AUsgabe der Werte hat mir aber nichts neues gebracht, vermutlich sitzen die Rundungsfehler dann irgendwo tiefer. Da ich die aber so und so nicht beheben kann muss ich mir irgendwie anderwitig helfen. Vielleicht ne KLasse schreiben, die intern einen Vector nutzt und die doubles mit 10 multipliziert und auf ints castet. Das sollte dann eigentlich keine Fehler mehr geben oder doch?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1327051</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1327051</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Tue, 17 Jul 2007 09:34:45 GMT</pubDate></item><item><title><![CDATA[Reply to Elemente einfuegen in vector bzw. map on Tue, 17 Jul 2007 09:36:54 GMT]]></title><description><![CDATA[<p>pumuckl schrieb:</p>
<blockquote>
<p>Gibs hier etwas wieder Rundungsfehler oder aehnliches?</p>
</blockquote>
<p>Stark anzunehmen. Und solange du mit double-Werten arbeitest, wirst du diese Rundungsfehler auch nicht beseitigen können (double ist nicht in der Lage, den Wert 0.1 exakt darzustellen - und wenn du ihn ein paarmal aufaddierst, summieren sich die Rundungsfehler so weit, daß du sie tatsächlich bemerkst).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1327053</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1327053</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Tue, 17 Jul 2007 09:36:54 GMT</pubDate></item><item><title><![CDATA[Reply to Elemente einfuegen in vector bzw. map on Tue, 17 Jul 2007 09:42:23 GMT]]></title><description><![CDATA[<p>Es ist übrigens kein guter Gedanke ein Objekt <em>register</em> zu nennen! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":-)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1327058</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1327058</guid><dc:creator><![CDATA[David_pb]]></dc:creator><pubDate>Tue, 17 Jul 2007 09:42:23 GMT</pubDate></item><item><title><![CDATA[Reply to Elemente einfuegen in vector bzw. map on Tue, 17 Jul 2007 09:49:08 GMT]]></title><description><![CDATA[<p>CStoll schrieb:</p>
<blockquote>
<p>(double ist nicht in der Lage, den Wert 0.1 exakt darzustellen - und wenn du ihn ein paarmal aufaddierst, summieren sich die Rundungsfehler so weit, daß du sie tatsächlich bemerkst).</p>
</blockquote>
<p>Sprich, der Rundungsfehler entsteht ind er Schleife und ich kann auch durch Basteln einer eigenen double-map nichts erreichen. Also doch lieber</p>
<pre><code class="language-cpp">for (int i = 11; i &lt;=17; i++)
{
  cout &lt;&lt; lumis[P64][s000_033_066][i/10.0] &lt;&lt; endl;
}
</code></pre>
<p><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/1327069</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1327069</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Tue, 17 Jul 2007 09:49:08 GMT</pubDate></item><item><title><![CDATA[Reply to Elemente einfuegen in vector bzw. map on Tue, 17 Jul 2007 10:06:17 GMT]]></title><description><![CDATA[<p>du könntest versuchen die rundungsfehler zum umgehen (bzw. damit klar zu kommen), indem du dir einen eigenen Datentyp schreibst, der ein double kapselt und vergleiche mit anderen doubles zulässt. Er muss bei vergleichen natürlich eine gewissen toleranz haben.<br />
Dann kannst du zB sowas machen:</p>
<pre><code class="language-cpp">class MyTolerantDouble
{
public:
  MyTolerantDouble(double val) : { m_Val := val; };
// kopierkosntruktor, zuweisung etc.

public operator==(const MyTolerantDouble&amp;) { /* hier mit Toleranz vergleichen */ };
};

typedef map&lt;MyTolerantDouble, double&gt; P81ToLumiMap;
</code></pre>
<p>Dann kannst du die Toleranz auf einen Wert stellen und dann nochmal versuchen, obs geht. Das is ja grad das tolle an templates, dass die datentypen nur bestimmte anforderungen erfüllen müssen, aber nciht vollkommen fest definiert sind im template.<br />
Damit könntest du das problem umgehen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1327087</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1327087</guid><dc:creator><![CDATA[Maxi]]></dc:creator><pubDate>Tue, 17 Jul 2007 10:06:17 GMT</pubDate></item><item><title><![CDATA[Reply to Elemente einfuegen in vector bzw. map on Tue, 17 Jul 2007 10:08:10 GMT]]></title><description><![CDATA[<p>pumuckl schrieb:</p>
<blockquote>
<p>CStoll schrieb:</p>
<blockquote>
<p>(double ist nicht in der Lage, den Wert 0.1 exakt darzustellen - und wenn du ihn ein paarmal aufaddierst, summieren sich die Rundungsfehler so weit, daß du sie tatsächlich bemerkst).</p>
</blockquote>
<p>Sprich, der Rundungsfehler entsteht ind er Schleife und ich kann auch durch Basteln einer eigenen double-map nichts erreichen.</p>
</blockquote>
<p>Eventuell könntest du etwas erreichen, wenn du einen eigenen double-Komparator schreibst, der über diese Rundungsfehler hinwegsehen kann. Aber ansonsten ist es wohl das beste, double gar nicht an map&lt;&gt;-Schlüssel einzusetzen.</p>
<blockquote>
<p>Also doch lieber</p>
<pre><code class="language-cpp">for (int i = 11; i &lt;=17; i++)
{
  cout &lt;&lt; lumis[P64][s000_033_066][i/10.0] &lt;&lt; endl;
}
</code></pre>
<p><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>
</blockquote>
<p>Ich bin mir nicht einmal sicher, ob das dein Problem löst oder nur aufschiebt.</p>
<p>PS: Ist es wirklich nötig, einen <strong>direkten</strong> Bezug zwischen dem double und dem Zielwert zu haben? Wenn du wirklich nur diese 7 Werte in der map stehen hast, kannst du sie mit einer Transformation (10*x-11) auf den ganzzahligen Bereich 0..6 übersetzen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1327088</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1327088</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Tue, 17 Jul 2007 10:08:10 GMT</pubDate></item><item><title><![CDATA[Reply to Elemente einfuegen in vector bzw. map on Tue, 17 Jul 2007 11:22:57 GMT]]></title><description><![CDATA[<p>ich hab &quot;ein bisschen&quot; mehr als diese 7 werte. am ende werden es 2x6x15 Werte sein plus einige wo ich nicht iterieren muss (wie bei lumis[P64][DIRECT] in meinem beispiel oben) Ich habe ueberlegt, statt der double keys int keys zu nehmen, denn es wird bei einer Nachkommastelle bleiben. An Stelle der Map koennte man noch einen vetor nehmen, zu dem man einen offset speichert, damit z.B der Platz fuer index 0-10 nicht sinnlos vergeudet wird, wenn man nur 11-25 belegt...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1327153</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1327153</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Tue, 17 Jul 2007 11:22:57 GMT</pubDate></item><item><title><![CDATA[Reply to Elemente einfuegen in vector bzw. map on Tue, 17 Jul 2007 13:31:29 GMT]]></title><description><![CDATA[<p>so, vermutlich isses schon zigmal gemacht worden, aber ich hab hier mal einen offsetvector geschrieben. Im Grunde hab ich das ganze interface von std::vector abgepinnt, es wird alles stumpf weitergeleitet abgeshen vom operator[], den Konstruktoren die die Initialisierung dess Offset erlauben und den neuen Methoden offset() und set_offset(n), von denen letztere den Container derart vergoessert/verkleinert, dass a) size() + offset() = const; b) falls n &gt; alter<br />
offset, fallen die vorderen Elemente weg.<br />
Zusatzlich habe ich einen Konvertierungsoperator nach vector&lt;T, Allocator&gt; geschrieben, um hin- und herkonvertieren zu ermoeglichen.</p>
<pre><code class="language-cpp">#ifndef offsetvector__
#define offsetvector__

#include &lt;vector&gt;

template &lt;class T, class Allocator = std::allocator&lt;T&gt; &gt;

class offsetvector
{
public:
  typedef std::vector&lt;T, Allocator&gt; stdvec;

  typedef typename stdvec::reference         reference;
  typedef typename stdvec::const_reference   const_reference;
  typedef typename stdvec::iterator          iterator;
  typedef typename stdvec::const_iterator    const_iterator;
  typedef typename stdvec::size_type         size_type;
  typedef typename stdvec::difference_type   difference_type;
  typedef typename stdvec::value_type        value_type;
  typedef typename stdvec::allocator_type    allocator_type;
  typedef typename stdvec::pointer           pointer;
  typedef typename stdvec::const_pointer     const_pointer;
  typedef typename stdvec::reverse_iterator  reverse_iterator;
  typedef typename stdvec::const_reverse_iterator 
                                       const_reverse_iterator;

  // Constructor and assignment:

  explicit offsetvector(const Allocator&amp; a = Allocator())
    : vec_(a), offs_(0) {}
  explicit offsetvector(size_type n, size_type offs = 0, 
	      const T&amp; value = T(), 
	      const Allocator&amp; a = Allocator())
    : vec_(n, value, a), offs_(offs) {}
  template&lt;class InputIterator&gt;
  offsetvector(InputIterator first, InputIterator last, size_type offs = 0,
     const Allocator&amp; a = Allocator())
    : vec_(first, last, a), offs_(offs) {}
  offsetvector(const offsetvector&lt;T, Allocator&gt;&amp; orig) 
    : vec_(orig.vec_), offs_(orig.offs_) {}
  offsetvector(const vector&lt;T, Allocator&gt;&amp; orig, size_type offs = 0)
    : vec_(orig), offs_(offs) {}

  operator vector&lt;T, Allocator&gt;() { return vec_; }
  ~offsetvector() {}

  offsetvector&lt;T, Allocator&gt;&amp; 
  operator=(const offsetvector&lt;T, Allocator&gt;&amp; orig)
  { 
    if (&amp;orig == this) return *this;
    vec_ = orig.vec_; offs_ = orig.offs_;
    return *this;
  }

  template&lt;class InputIterator&gt;
  void assign(InputIterator first, InputIterator last, size_type offs = 0)
  { offs_ = offs; vec_.assign(first, last); }

  // Iterators:
  iterator begin() { return vec_.begin(); }
  const_iterator begin() const { return vec_.begin(); }
  iterator end() { return vec_.end(); }
  const_iterator end() const { return vec_.end(); }
  reverse_iterator rbegin() { return vec_.rbegin(); }
  const_reverse_iterator rbegin() const { return vec_.rbegin(); }
  reverse_iterator rend() { return vec_.rend(); }
  const_reverse_iterator rend() const { return vec_.rend(); }

  //size
  size_type size() const { return vec_.size(); }
  size_type offset() const { return offs_; }
  size_type max_size() const { return vec_.max_size(); }
  void resize(size_type sz, T c = T()) { vec_.resize(sz, c); }
  size_type capacity() const { return vec_.capacity(); }
  bool empty() const { return vec_.empty(); }
  void reserve(size_type n) { vec_.reserve(n); }

  // set offset: set start index
  // results in resizing of offsetvector
  void set_offset(size_type n) 
  {
    if (n == offs_) return;
    size_type newsize = offs_ + vec_.size() - n;
    if (newsize &lt;= 0) vec_.clear();
    else
      {
	stdvec tmp(vec_.rbegin(), vec_.rend());
	tmp.resize(newsize);
	vec_.assign(tmp.rbegin(), tmp.rend());
      }
    offs_ = n;
  }

  // access
  reference operator[] (size_type n)
  { return vec_[n - offs_]; }
  const_reference operator[] (size_type n) const
  { return vec_[n - offs_]; }
  const_reference at(size_type n) const
  { return vec_.at(n - offs_); }
  reference at(size_type n)
  { return vec_.at(n - offs); }
  reference front() { return vec_.front(); }
  const_reference front() const { return vec_.front(); }
  reference back() { return vec_.back(); }
  const_reference back() const { return vec_.back(); }

  void push_back(const T&amp; x) { vec_.push_back(x); }
  void pop_back() { vec_.pop_back(); }
  iterator insert(iterator position, const T&amp; x = T())
  { vec_.insert(position, x); }
  iterator insert(iterator position, size_type n, const T&amp; x = T())
  { return vec_.insert(position, n, x); }
  template&lt;class InputIterator&gt;
  void insert(iterator position, InputIterator first, 
	      InputIterator last)
  { vec_.insert(position, first, last); }
  iterator erase(iterator position)
  { return vec_.erase(position); }
  iterator erase(iterator first, iterator last)
  { return vec_.erase(first, last); }
  void swap(offsetvector&lt;T, Allocator&gt;&amp; other)
  { 
    size_type tmp = offs_; 
    offs_ = other.offs_; 
    other.offs_ = tmp;
    vec_.swap(other.vec_);
  }
  void clear() { vec_.clear(); }

protected:
  stdvec vec_;
  size_type offs_;
};

#endif
</code></pre>
<p>/edit: einige typos entfernt</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1327245</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1327245</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Tue, 17 Jul 2007 13:31:29 GMT</pubDate></item></channel></rss>