<?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[Vector für unterschiedliche Datentypen]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>bin neu hier und auch neu in der c++ - Welt. D.h. ich habe bereits ganze 2 Monate &quot;Erfahrung&quot; angesammelt. Also nicht zu böse mit mir sein, wenn mein Code mal unsauber, meine Fragen mal &quot;blöd&quot; sind o.ä. <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>Aber nun zum Problem:<br />
Vectoren in c++ sind ja was feines, nur hat mich bei einer Aufgabenstellung gestört, dass sie nur Elemente eines Typs beinhalten können. Ein wenig herumgegoogelt habe ich auch und festgestellt, dass es dafür wohl auch keine ganz einfache Lösung gibt - wohl aber auch, dass es in Boost einen Container gibt, der das kann.<br />
Ich möchte mich nichtsdestotrotz selbst an einer eigenen Klasse multivector versuchen, die die Datentypen int, long, float, double und long double aufnehmen kann (man will ja selbst was dazulernen und nicht nur anwenden).</p>
<p>Erst mal der Code:</p>
<pre><code class="language-cpp">#include &lt;vector&gt;

using namespace std;

class multivector{
public:
  //Konstruktoren:
  multivector(){             //mit &quot;unbegrenzter&quot; Größe
    counter = 0;
    limit = false;
  }
  multivector(int max_size){ //mit Größe max_size
    counter = 0;
    limit = true;

    datatype.resize(max_size);
    int_vector.resize(max_size);
    long_vector.resize(max_size);
    float_vector.resize(max_size);
    double_vector.resize(max_size);
    long_double_vector.resize(max_size);
  } 

  //push_backs für die einzelnen Fälle
  void push_back(int value){
    if (!limit)
      int_vector.resize(counter + 1); //speicher reservieren für &quot;unbegr.&quot; Größe
    int_vector.at(counter) = value;
    counter++;
    datatype.push_back(1);
  }
  void push_back(long value){
    if (!limit)
      long_vector.resize(counter + 1);
    long_vector.at(counter) = value;
    counter++;
    datatype.push_back(2);
  }
  void push_back(float value){
    if (!limit)
      float_vector.resize(counter + 1);
    float_vector.at(counter) = value;
    counter++;
    datatype.push_back(3);
  }
  void push_back(double value){
    if (!limit)
      double_vector.resize(counter + 1);
    double_vector.at(counter) = value;
    counter++;
    datatype.push_back(4);
  }
  void push_back(long double value){
    if (!limit)
      long_double_vector.resize(counter + 1);
    long_double_vector.at(counter) = value;
    counter++;
    datatype.push_back(5);
  }

  /*Für die Ausgabe sowas in der Art: 
    int at (int position){
      if (datatype[position] == 1)
        return int_vector[position];
      else if (datatype[position] == 2)
        return long_vector[position];
      etc...
    }
  */

  int size(){
    return counter;
  }

  bool empty(){
    if (counter == 0) return true;
    else return false;
  }

private:
  int counter; //für size()
  vector&lt;int&gt; datatype;
  bool limit; //für Konstruktoren. unbeschränkt viele Elemente oder nicht?

  //vectoren für die einzelne fälle
  vector&lt;int&gt; int_vector;
  vector&lt;long&gt; long_vector;
  vector&lt;float&gt; float_vector;
  vector&lt;double&gt; double_vector;
  vector&lt;long double&gt; long_double_vector;
};
</code></pre>
<p>Ganz grob und umgangssprachlich ist das ein Vector, der wiederum aus Vectoren besteht, welche jeweils die geforderten Datentypen aufnehmen können. Jeder übergebene Datentyp wird in den entsprechenden Vector geschrieben. Im int-vector datatype stehen Ganzzahlen von 1 bis 5 (stellvertretend für: von int bis long double), womit man (so weit mein Gedankengang) später jeder Position im multivector einen Typ zuordnen kann.<br />
Jetzt der Knackpunkt: Die Methode &quot;int at (int position)&quot; (auskommentiert), welche sozusagen der Methode &quot;at&quot; vom normalen vector entsprechen soll. Problem: Sie gibt nunmal einen int zurück. Soll aber abhängig vom Wert in datatype einen entsprechenden Typ zurückgeben (wie im Methodenkörper angedeutet).<br />
Stellt sich die Frage: Kann man entweder<br />
1. einer Methode mehrere Rückgabetypen &quot;zur Auswahl&quot; stellen (ich fürchte nicht)<br />
oder<br />
2. mehrere im Grunde gleiche Methoden (aber verschiedenen Typs) definieren, welche mit if verzweigt werden?</p>
<p>Oder habt ihr eine ganz andere Idee? Freu mich über jede Anregung <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/topic/277942/vector-für-unterschiedliche-datentypen</link><generator>RSS for Node</generator><lastBuildDate>Tue, 25 Aug 2026 15:31:54 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/277942.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 26 Nov 2010 18:12:32 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Vector für unterschiedliche Datentypen on Fri, 26 Nov 2010 18:12:32 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>bin neu hier und auch neu in der c++ - Welt. D.h. ich habe bereits ganze 2 Monate &quot;Erfahrung&quot; angesammelt. Also nicht zu böse mit mir sein, wenn mein Code mal unsauber, meine Fragen mal &quot;blöd&quot; sind o.ä. <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>Aber nun zum Problem:<br />
Vectoren in c++ sind ja was feines, nur hat mich bei einer Aufgabenstellung gestört, dass sie nur Elemente eines Typs beinhalten können. Ein wenig herumgegoogelt habe ich auch und festgestellt, dass es dafür wohl auch keine ganz einfache Lösung gibt - wohl aber auch, dass es in Boost einen Container gibt, der das kann.<br />
Ich möchte mich nichtsdestotrotz selbst an einer eigenen Klasse multivector versuchen, die die Datentypen int, long, float, double und long double aufnehmen kann (man will ja selbst was dazulernen und nicht nur anwenden).</p>
<p>Erst mal der Code:</p>
<pre><code class="language-cpp">#include &lt;vector&gt;

using namespace std;

class multivector{
public:
  //Konstruktoren:
  multivector(){             //mit &quot;unbegrenzter&quot; Größe
    counter = 0;
    limit = false;
  }
  multivector(int max_size){ //mit Größe max_size
    counter = 0;
    limit = true;

    datatype.resize(max_size);
    int_vector.resize(max_size);
    long_vector.resize(max_size);
    float_vector.resize(max_size);
    double_vector.resize(max_size);
    long_double_vector.resize(max_size);
  } 

  //push_backs für die einzelnen Fälle
  void push_back(int value){
    if (!limit)
      int_vector.resize(counter + 1); //speicher reservieren für &quot;unbegr.&quot; Größe
    int_vector.at(counter) = value;
    counter++;
    datatype.push_back(1);
  }
  void push_back(long value){
    if (!limit)
      long_vector.resize(counter + 1);
    long_vector.at(counter) = value;
    counter++;
    datatype.push_back(2);
  }
  void push_back(float value){
    if (!limit)
      float_vector.resize(counter + 1);
    float_vector.at(counter) = value;
    counter++;
    datatype.push_back(3);
  }
  void push_back(double value){
    if (!limit)
      double_vector.resize(counter + 1);
    double_vector.at(counter) = value;
    counter++;
    datatype.push_back(4);
  }
  void push_back(long double value){
    if (!limit)
      long_double_vector.resize(counter + 1);
    long_double_vector.at(counter) = value;
    counter++;
    datatype.push_back(5);
  }

  /*Für die Ausgabe sowas in der Art: 
    int at (int position){
      if (datatype[position] == 1)
        return int_vector[position];
      else if (datatype[position] == 2)
        return long_vector[position];
      etc...
    }
  */

  int size(){
    return counter;
  }

  bool empty(){
    if (counter == 0) return true;
    else return false;
  }

private:
  int counter; //für size()
  vector&lt;int&gt; datatype;
  bool limit; //für Konstruktoren. unbeschränkt viele Elemente oder nicht?

  //vectoren für die einzelne fälle
  vector&lt;int&gt; int_vector;
  vector&lt;long&gt; long_vector;
  vector&lt;float&gt; float_vector;
  vector&lt;double&gt; double_vector;
  vector&lt;long double&gt; long_double_vector;
};
</code></pre>
<p>Ganz grob und umgangssprachlich ist das ein Vector, der wiederum aus Vectoren besteht, welche jeweils die geforderten Datentypen aufnehmen können. Jeder übergebene Datentyp wird in den entsprechenden Vector geschrieben. Im int-vector datatype stehen Ganzzahlen von 1 bis 5 (stellvertretend für: von int bis long double), womit man (so weit mein Gedankengang) später jeder Position im multivector einen Typ zuordnen kann.<br />
Jetzt der Knackpunkt: Die Methode &quot;int at (int position)&quot; (auskommentiert), welche sozusagen der Methode &quot;at&quot; vom normalen vector entsprechen soll. Problem: Sie gibt nunmal einen int zurück. Soll aber abhängig vom Wert in datatype einen entsprechenden Typ zurückgeben (wie im Methodenkörper angedeutet).<br />
Stellt sich die Frage: Kann man entweder<br />
1. einer Methode mehrere Rückgabetypen &quot;zur Auswahl&quot; stellen (ich fürchte nicht)<br />
oder<br />
2. mehrere im Grunde gleiche Methoden (aber verschiedenen Typs) definieren, welche mit if verzweigt werden?</p>
<p>Oder habt ihr eine ganz andere Idee? Freu mich über jede Anregung <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/1986367</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1986367</guid><dc:creator><![CDATA[g0nz0]]></dc:creator><pubDate>Fri, 26 Nov 2010 18:12:32 GMT</pubDate></item><item><title><![CDATA[Reply to Vector für unterschiedliche Datentypen on Fri, 26 Nov 2010 18:24:03 GMT]]></title><description><![CDATA[<p>g0nz0 schrieb:</p>
<blockquote>
<p>Oder habt ihr eine ganz andere Idee? Freu mich über jede Anregung <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>
</blockquote>
<p>Interessant ist doch, dass der Wunsch, mehrere grundsätzlich unabhängige Typen in einen Container (oder eine Variable) zu stecken, hier ab und zu vorkommt – und zwar vor allem von Leuten, die sich noch nicht allzu lange mit C++ beschäftigen. <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>
<p>Darum unterstelle ich dir, dass du das mehr als Experiment durchführen willst und nicht wirklich eine konkrete Problemstellung dahinter steckt. Kann das sein? Denn das Gemeinsam-Verwalten mag zwar nützlich klingen, bringt jedoch in der Praxis einige Probleme mit sich und ist oft gar nicht sinnvoll. Zumindest nicht in der Weise, wie es sich Anfänger häufig vorstellen.</p>
<p>Wie willst du z.B. auf die unterschiedlichen Typen reagieren? Manuell mit <code>if</code> oder <code>switch</code> Fälle unterscheiden ist nicht empfehlenswert. Denn du speicherst ja die Typen gemeinsam ab, weil sie etwas gemeinsam haben. Also solltest du die Gemeinsamkeit irgendwie nutzen können. Wenn du eine Abstraktion aufbauen kannst, die intern für jeden Typen eine semantisch ähnliche Operation durchführt, aber von aussen gleich aussehen soll, kannst du sogar ein C++-Sprachmittel namens Laufzeitpolymorphie einsetzen. Dafür solltest du dich aber ausführlich mit Klassen beschäftigt haben.</p>
<p>Aber wie schon erwähnt bleibt vor allem die Frage, wozu du das Ganze benötigst. <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/1986382</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1986382</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Fri, 26 Nov 2010 18:24:03 GMT</pubDate></item><item><title><![CDATA[Reply to Vector für unterschiedliche Datentypen on Fri, 26 Nov 2010 18:25:31 GMT]]></title><description><![CDATA[<p>Frage: Weiss der Benutzer deiner Klasse, welchen Rückgabewert er bekommt?<br />
Die Syntax</p>
<pre><code class="language-cpp">int i    = mvec.at&lt;int   &gt;(31);
float f  = mvec.at&lt;float &gt;(41);
double d = mvec.at&lt;double&gt;(59);
</code></pre>
<p>bekommst du recht einfach hin. In dem Fall brauchst du auch nur einen Vektor.</p>
<p>Wenn der Nutzer allerdings nicht weiss, was er für einen Rückgabewert er bekommt hast du ein Problem. Denn diesen müsste er erst einmal herausfinden und dafür benötigst du zusätzlich Informationen über den Typen eines Elements an einer bestimmten Position (möglich mit zwei Vektoren).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1986385</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1986385</guid><dc:creator><![CDATA[MulpaRadig]]></dc:creator><pubDate>Fri, 26 Nov 2010 18:25:31 GMT</pubDate></item><item><title><![CDATA[Reply to Vector für unterschiedliche Datentypen on Fri, 26 Nov 2010 18:41:50 GMT]]></title><description><![CDATA[<p>Nein nein, da steht nichts konkretes dahinter. Experiment triffts ganz gut. Ich bin im Moment in der Phase, alles mögliche mal ausprobieren zu wollen. Ich weiß ehrlich gesagt schon gar nicht mehr, welche Aufgabe ich gerne mit soetwas lösen wollte. Aber wie gesagt - ich möchte neben den Hausaufgaben im Studium gelegentlich auch &quot;eigene&quot; Sachen ausprobieren (auch wenn ich keinen konkreten Nutzen daraus ziehe).</p>
<p>@MulpaRadig:<br />
Nein, das würde der Benutzer nicht wissen. Aber im vektor datatype stehen ja Zahlen von 1-5 (1 für int, 5 für long double). D.h. wenn ich herausfinden will, was z.B. in multivector[5] für ein Typ steckt, gucke ich in datatype[5]. Und je nach Wert, weiß ich schon bescheid.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1986402</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1986402</guid><dc:creator><![CDATA[g0nz0]]></dc:creator><pubDate>Fri, 26 Nov 2010 18:41:50 GMT</pubDate></item><item><title><![CDATA[Reply to Vector für unterschiedliche Datentypen on Sat, 27 Nov 2010 10:53:02 GMT]]></title><description><![CDATA[<p>du bräuchtest dann noch mindestens eine struktur die speichert wann was wo abgelegt wurde und eine Möglichkeit das zurückzugeben.</p>
<p>Es wäre einfacher einen &quot;multidatenhalter&quot; zu bauen und den dann in den Vek zu stecken, skizziert etwa so:</p>
<pre><code class="language-cpp">class MuliD 
{
    bool m_nofrac;
    long double m_double;
    long long int m_int;
public:
    MultiD(long double ld)  :  m_double(ld), m_nofrac(false) {}
    MultiD(double d)        :  m_double(d),  m_nofrac(false) {}
    MultiD(float f)         :  m_double(f),  m_nofrac(false) {}

    MultiD(unsigned int ui) :  m_int(ui),    m_nofrac(true)  {}
    MultiD(int i)           :  m_int(i),     m_nofrac(true)  {}
    MultiD(bool b)          :  m_int(b),     m_nofrac(true)  {}

    bool isInt() { return m_nofrac; }
    bool isDouble() { return !m_nofrac; }

    long double asDouble() { if (!m_nofrac) return m_double; return (long double(m_int)); }
    long int asInt()    { if (!m_nofrac) return (long long int(m_double)); return m_int; }
}
</code></pre>
<p>oder so: <a href="http://doc.qt.nokia.com/4.6/qvariant.html" rel="nofollow">http://doc.qt.nokia.com/4.6/qvariant.html</a></p>
<p>Insgesamt ist sowas im Eigenbau aber müssig ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1986607</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1986607</guid><dc:creator><![CDATA[padreigh]]></dc:creator><pubDate>Sat, 27 Nov 2010 10:53:02 GMT</pubDate></item><item><title><![CDATA[Reply to Vector für unterschiedliche Datentypen on Sat, 27 Nov 2010 12:41:23 GMT]]></title><description><![CDATA[<p>Ich finde die Implementation von <a href="http://live.boost.org/doc/html/variant.html" rel="nofollow">Boost.Variant</a> deutlich besser als die von Qt.</p>
<p>Aber stimmt schon; entweder läuft das Problem auf etwas in der Art von <code>std::vector&lt;boost::variant&gt;</code> oder auf einen <code>variant_vector&lt;&gt;</code> (der die Funktionalität von Variant gleich selber implementiert und deshalb performanter ist) heraus. Das Thema ist aber sehr komplex...</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/25374">@g0nz0</a>: Ich habe mich eher gefragt, wie der Benutzer denn den Container aufrufen sollte. Irgendwohin muss er ja das Element speichern und daher muss er ja eigentlich im Augenblick der Zuweisung wissen, welchen Typ er hat. In C++ herrscht starke Typisierung, daher geht so etwas wie</p>
<pre><code class="language-cpp">var x = mvec.at(5); // var ist entweder int oder double oder long oder ...
</code></pre>
<p>nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1986673</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1986673</guid><dc:creator><![CDATA[MulpaRadig]]></dc:creator><pubDate>Sat, 27 Nov 2010 12:41:23 GMT</pubDate></item><item><title><![CDATA[Reply to Vector für unterschiedliche Datentypen on Sat, 27 Nov 2010 13:33:18 GMT]]></title><description><![CDATA[<p>Boost.Any wäre hier auch noch zu nennen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1986694</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1986694</guid><dc:creator><![CDATA[theta]]></dc:creator><pubDate>Sat, 27 Nov 2010 13:33:18 GMT</pubDate></item><item><title><![CDATA[Reply to Vector für unterschiedliche Datentypen on Sat, 27 Nov 2010 13:52:52 GMT]]></title><description><![CDATA[<p>Damit der Unterschied klar wird:</p>
<ul>
<li><em>Boost.Any</em> kann beliebige Typen speichern (im Prinzip ein typsicherer <code>void*</code> ).</li>
<li><em>Boost.Variant</em> kann Typen aus einer vorgegebenen Menge speichern (also eine Art moderne <code>union</code> ).</li>
</ul>
]]></description><link>https://www.c-plusplus.net/forum/post/1986705</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1986705</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sat, 27 Nov 2010 13:52:52 GMT</pubDate></item></channel></rss>