Liste von Objekten

kstanger

Neues Mitglied
Hallo allerseits,
ich suche zu einer Liste von Objekten in C# das Pendant in C++.
Hier mein Objekt mit den Konstruktoren in C#:
C#:
public
class Farbe {
public
  Farbe() {}

public
  Farbe(int id, byte red, byte green, byte blue, string farbname) {
    ID = id;
    Red = red;
    Green = green;
    Blue = blue;
    Farbname = farbname;
  }
public
  int ID {
    get;
    set;
  }
public
  byte Red {
    get;
    set;
  }
public
  byte Green {
    get;
    set;
  }
public
  byte Blue {
    get;
    set;
  }
public
  string Farbname {
    get;
    set;
  }
}

und hier die Listendefinition:
C#:
public
List<Farbe> Farben;

Weiß jemand, wie so etwas in C++ aussieht?
 
Zuletzt bearbeitet von einem Moderator:

german

Aktives Mitglied
devCommunity-Experte
Es gibt diverse Containerklassen in C++. Auch std::list. Ich vermute allerdings, dass std::vector die Klasse ist die dich interessiert.
C++:
#include <iostream>
#include <string>
#include <string_view>
#include <vector>

class Farbe {
public:
  Farbe() noexcept = default;

  // clang-format off
  Farbe(int id, unsigned char red, unsigned char green, unsigned char blue, std::string_view farbname) noexcept :
    ID{id}, Red{red}, Green{green}, Blue{blue}, Farbname{farbname}
  {
  }
  // clang-format on

  int ID{};
  unsigned char Red{};
  unsigned char Green{};
  unsigned char Blue{};
  std::string Farbname{};
};

int main() {
  std::vector<Farbe> Farben{{0, 0, 0, 0, "schwarz"}, {1, 255, 0, 0, "rot"}};
  std::cout << Farben.at(0).Farbname << std::endl;
}
Wenn du neue Farben einfügen (und nicht nur am Ende hinzufügen) willst schau dir std::deque an. Falls die Anzahl Farben zur Compiletime feststeht und sich nicht zur Runtime ändern muss, wäre sicherlich std::array der Container der Wahl.
 
Zuletzt bearbeitet:

kstanger

Neues Mitglied
Vielen Dank für diese Information.
Wenn ich das richtig verstanden habe, ist std::vector das Pendant zu List. Ich muss das jetzt noch genau in der Doku anschauen. Ich gehe davon aus, dass Farben eine "beliebig lange" Liste von Objekten std::vector<Farbe> ist.
Die Anzahl wird aus einer Datei gelesen oder alternativ vom PC auf einen Arduino heruntergeladen; daher weiß man zur Compiletime die Größe noch nicht.
 

german

Aktives Mitglied
devCommunity-Experte
Wie die List Klasse in C# implementiert ist, weiß ich nicht. Üblicherweise deutet der Name auf eine doppelt verlinkte Liste hin. Dabei sind die Elemente wirklich einzelne durch Pointer untereinander verknüpfte Speicherbereiche. Das erzeugt Overhead und bedeutet, dass für den Zugriff auf ein willkürliches Element die Liste von einem der beiden Enden durchlaufen werden muss um zum Ziel zu kommen. Die std::vector Klasse in C++ unterscheidet sich im Aufbau grundlegend dahingehend, dass sie in einem garantiert kontinuierlichen Speicherbereich abgelegt wird. Heißt, wenn du Zugriff auf ein Element haben willst, ist das eine Operation mit Komplexität O(1) statt O(n). Nachteil ist, dass wenn du Elemente an irgendeiner Stelle einfügen willst, im besten Fall alle nachfolgenden Elemente um ein Element weiter kopiert werden müssen. Die Wahl der Containerklasse ist also abhängig davon, was genau du in deinem Programmcode damit anstellst. Zumindest bei performancekritischen Programmen.
 

german

Aktives Mitglied
devCommunity-Experte
Hab meinen Code noch mal editiert, da der Code-Formatter des Forums den Konstruktor einfach zu einem Einzeiler gemacht hatte ¯\_(ツ)_/¯ Das war natürlich nicht mehr wirklich lesbar.
 
Oben Unten