Boolschen Ausdruck aus String lesen und verarbeiten



  • Guten Tag!

    habe folgendes Problem:
    Ich habe mehrere Klassen, die unterschiedliche Member haben. Beispielsweise:

    class Person {
       string name;
       int alter;
    };
    

    Von diesen Klassen habe ich dann im Programm viele Instanzen, z.B. in einem std::vector<Person>.

    Jetzt will ich den Benutzer einen string eingeben lassen, der einem boolschen Ausdruck entspricht um bestimmte Personen zu selektieren. Beispiel:
    "alter=20 AND name=!huber"
    Das Beispiel würde z.B. bedeuten, dass ich alle Personen anzeigen soll, die 20 Jahre alt sind und nicht Huber heissen.

    Ich bin mir noch nicht sicher, wie ich das in C++ designen kann. Ich muss erstmal irgendwie aus dem String ein "Regelwerk" aufbauen und dann die Personen durchgehen und gegen die Regeln prüfen.
    Kennt da jemand einen Ansatz und/oder eine Lib (STL? boost?), die mir bei dieser Lösung helfen könnte?

    Danke!



  • Man könnte SQLite als in memory Datenbank verwenden und die Daten statt in einem vector dort speichern. Wenn man es dann ganz einfach machen will, kann der Benutzer direkt die SQL-Bedingung eingeben.



  • booler schrieb:

    Guten Tag!

    habe folgendes Problem:
    Ich habe mehrere Klassen, die unterschiedliche Member haben. Beispielsweise:

    class Person {
       string name;
       int alter;
    };
    

    Von diesen Klassen habe ich dann im Programm viele Instanzen, z.B. in einem std::vector<Person>.

    Jetzt will ich den Benutzer einen string eingeben lassen, der einem boolschen Ausdruck entspricht um bestimmte Personen zu selektieren. Beispiel:
    "alter=20 AND name=!huber"
    Das Beispiel würde z.B. bedeuten, dass ich alle Personen anzeigen soll, die 20 Jahre alt sind und nicht Huber heissen.

    Ich bin mir noch nicht sicher, wie ich das in C++ designen kann. Ich muss erstmal irgendwie aus dem String ein "Regelwerk" aufbauen und dann die Personen durchgehen und gegen die Regeln prüfen.
    Kennt da jemand einen Ansatz und/oder eine Lib (STL? boost?), die mir bei dieser Lösung helfen könnte?

    Danke!

    bin mir nicht ganz sicher ob ich dich richtig verstanden habe...
    willst du nach 20 , nach 20 und !=Huber oder nur !=Huber suchen?

    falls du das anhand von i.was den Inhalt der string variablen(die einen "bool" wert enthalten soll) überprüfen und dann entscheiden willst...
    kannst meiner meinung nach entweder RegEx nehmen um regeln zusetzen und zuerkennen...
    was anderes würde mir bei einer "string" überprüfung nich einfallen, alternativ eignen sich noch so string-vergleiche (z.B. strcmp) oder soetwas... ist aber nicht ganz so "flexibel" wie regex...

    eine weitere frage wäre wie liegen dir die daten vor in einer datenbank ?



  • Ich habe keine Datenbank. Wie in meinem Posting geschrieben habe ich einfach nur Objekte in Containern (eben z.B. vector<Person>).
    Ferner habe ich wie beschrieben einen string, der einem boolschen Ausdruck entspricht.
    Die Dinger werden irgendwie so aussehen:
    "alter=20 OR alter=21 AND name=!huber"
    Hier muss ich also alle Personen in dem Vektor finden, die 20 oder 21 Jahre alt sind und NICHT Huber heissen (Klammerungen spielen erstmal keine Rolle).

    Die Idee mit SQL hatte ich auch schon, aber es erscheint mir etwas Overkill. Ich muesste dazu ja auch erstmal meine Daten plattdrücken in DB Tabellen...

    Ich hoffe erstmal weiterhin, dass es irgendeine C++ ParserLib oder sowas gibt, die mir helfen könnte.



  • booler schrieb:

    Ich hoffe erstmal weiterhin, dass es irgendeine C++ ParserLib oder sowas gibt, die mir helfen könnte.

    Boost Spirit.



  • booler schrieb:

    Ich hoffe erstmal weiterhin, dass es irgendeine C++ ParserLib oder sowas gibt, die mir helfen könnte.

    Das Parsen ist der kleinste Teil Deines Problems 😮

    Boost::Spirit wurde ja schon genannt.
    Wenn Deine Abfrage-Sprache nicht zu kompliziert ist, dann ist sowas auch schnell selber geschrieben.



  • Wenn das wenige Datensätze sind, ist es Overkill da etwas selber zu schreiben. -> SQLite
    Wenn das viele Datensätze sind, willst du vernünftige Suchalgorithmen mit Indizes unter der Haube. -> SQLite
    Wenn du eigentlich nur eine spannende Programmieraufgabe lösen willst, ist egal, was du machst.


Log in to reply