Klasse mit dynamischen String-Array

Hallo zusammen,

nachdem ich hier shcon viele wertvolle Tipps durch Mitlesen bekommen habe, habe ich nun ein Projekt, für das ich noch keine Lösuung gefunden habe:

Ich möchte eine Klasse erstellen, die Strings (nicht char) in einem dynamischen Array speichert.

Ich stelle mir dabei folgenden Ablaufg vor:
1.) Die Klasse selbst hält nur einen Pointer auf das Array (ptrItemArray), welcher am Anfang als nullptr gespeichert wird

2.) Die void "begin" wird mit dem Parameter der Anzahl der String-Elemente aufgerufen:
Das Array mit der Anzahl der String-Elemente wird erstellt und der Pointer auf das Array in der o.g. Pointer-Variable (ptrItemArray) gespeichert.
Das Array selbst enthält zu diesem Zeitpunkt nullptr, da die Strings noch nicht angelegt werden sollen.

3.) Durch Aufruf der void "addItem" mit Angabe des Strings, soll das Array gefüllt werden, bis die max. Anzahl der Elemente erreicht ist.
D.h. jetzt wird ein String-Objekt instanziiert und der Pointer auf den String im Array gespeichert.

Über Code-Snipplets hierzu würde ich mich freuen. Wenn ihr bessere Ideen habe, wir man diese Doppel-Pointer (auf das Array, vom Array zu den Strings) vereinfachen könnte, immer her damit.

Viele Grüße
Frank

Libstdc++ ?
Dann std::vector oder std::array

Ohne die c++ Lib, dann, ist es mit der begin Methode schon zu spät.

legst du die Instanz dieser Klasse schon Global an oder wird das erst in einer Funktion zur Laufzeit gemacht?

Und die Gretchenfrage ... WARUM machst du das ... was willst du eigentlich machen?

Nein, keine Libstdc++.

Wenn begin() schon zu spät ist, dass könnte ich die Größe des Array's auf im Konstruktor angeben. Gäbe es dann einen Weg, das umzusetzen?

Ich möchte die Klasse in einer anderen Klasse dynamisch nutzen, also kein Global.

Warum? Ich möchte eine universelle Klasse erstellen, die Objekte mit ihrem Namen in der einer Reihenfolge sortiert. Die Anzahl der Objekte ist dynamisch.

dann wäre ein Suchbegriff template

Warum nicht?

Habe ich bisher nicht genutzt/gebraucht. Dumme Frage: Ist das Standard-C++ beim Arduino oder eine zusätzliche Library?

Das liegt ganz daran welche der vielen Arduinos du nutzt,
Aber das ist ja geheim,
Warum auch immer.

Nö, ist nicht geheim, ich nutzte einen ESP32.

Ja dann, ist die libstc++ dabei!

Das freut mich. Wie kann ich damit mein Projekt von oben lösen?

Rudimentäres Beispiel (für meine Wühlkiste):

#include <Streaming.h> // die Lib findest du selber ;-)
Print &cout = Serial; // cout Emulation für "Arme"

#include "array"
#include "algorithm"



template<size_t N>
class StringArrays
{
  private:
  using StringArray = std::array<String,N>;
  StringArray stringArray;

  public:
  StringArray &getStringArray()
  {
    return stringArray;
  }

  void sort()
  {
    std::sort(stringArray.begin(),stringArray.end());
  }
};


void setup() 
{
  Serial.begin(9600);
  cout << F("Start: ") << F(__FILE__) << endl;
  StringArrays<6> strArr;

  strArr.getStringArray()[0] = "Apfel";
  strArr.getStringArray()[3] = "Zitrone";
  strArr.getStringArray()[4] = "Frosch";
  
  cout << "Vor der Sortierung:" << endl;
  for(String &str:strArr.getStringArray()) cout << str << endl;
  cout << "-----------" << endl;

  strArr.sort();
  cout << "Nach der Sortierung:" << endl;
  for(String &str:strArr.getStringArray()) cout << str << endl;
  cout << "-----------" << endl;
}

void loop() 
{

}

Ausgabe:

Start: E:\Programme\arduino\portable\sketchbook\sketch_apr24f\sketch_apr24f.ino
Vor der Sortierung:
Apfel


Zitrone
Frosch

-----------
Nach der Sortierung:



Apfel
Frosch
Zitrone
-----------

(getestet auf einem UNO mit libstdc++ Erweiterung)

Getestet auf einem ESP32 geht es erwartungsgemäß auch ohne die include am Programmanfang.

Umlaute werden ebenfalls erwartungsgemäß ans Ende sortiert:

Frosch
Zitrone
Äpfel
-----------

Danke, für den Test!

Die sort() Funktionalität ist nach Belieben anpassbar.
Der Standard Sortieralgorithmus ist hier anwendbar, weil String den > Operator (und weitere) implementiert.

Gut zu wissen, bei sort gibt es noch einen dritten Parameter für eine eigene Sortierlogik :slightly_smiling_face:
std::sort(s.begin(), s.end(), customLess);

So ist es!

Hier mal ein Beispiel, welches die Zellen wie gehabt sortiert, allerdings die leeren Zellen nach unten.


template<size_t N>
class StringArrays
{
  private:
  using StringArray = std::array<String,N>;
  StringArray stringArray;

  public:
  StringArray &getStringArray()
  {
    return stringArray;
  }

  void sort()
  {
    //std::sort(stringArray.begin(),stringArray.end());
    std::sort(stringArray.begin(),stringArray.end(),[](String &a,String &b) -> bool
                                                    {
                                                      if(!a.length()) return false;
                                                      if(!b.length()) return true;
                                                      return a<b;
                                                    } 
              );
  }
};

wow, ich bin beeindruckt. Habt vielen Dank für diese wertvollen Tipps. Ich hätte nicht gedacht, dass ich mein Thema so einfach und elegant gelöst bekomme.

Danke für die Blumen.