Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. International
  3. German
  4. Welchen Containertyp verwenden
Forum Updated to NodeBB v4.3 + New Features

Welchen Containertyp verwenden

Scheduled Pinned Locked Moved Solved German
12 Posts 3 Posters 2.7k Views
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • jsulmJ jsulm

    @Throndar said in Welchen Containertyp verwenden:

    wollte ich einfach mal fragen was denn der "richtige" Weg ist eine Menge "x" von Objekten zur weiteren Verwertung zu speichern.

    Das hängt stark davon ab wie die Elemente in dem Container benutzt werden. Und das ist etwas was aus dem Post nicht wirklich hervorgeht. Es gibt kein "richtig" für alle Use Cases. Wie willst du auf die Elemente zugreifen? Ich vermute, dass du einen bestimmten Client identifizieren musst, oder? Über einen Index? Über einen Namen? Über einen Hash?
    Hier gibt es einige Informationen: http://doc.qt.io/qt-5/containers.html

    T Offline
    T Offline
    Throndar
    wrote on last edited by Throndar
    #3

    Hallo @jsulm,

    erstmal danke für deine Antwort.

    Im nächsten Step sollen die Clients (die ich aktuell in einer Tabelle anzeige) per Mausklick ausgewählt werden um eine Verbindung per Websocket zum entsprechenden Rechner aufzubauen. (um dann im Nachgang wenn eine Verbindung besteht z.B. Textnachrichten zu übertragen)

    Dafür müsste ich auf das jeweilige Objekt zugreifen und die Properties die das Objekt beinhaltet (Name, Adresse, Port) zum Verbindungsaufbau weiter verwenden.

    Nach dem Link wäre das QList an der Stelle auf Grund der Geschwindigkeitsvorteile und da ich nicht zwingend die aufeinanderfolgenden Speicherbereiche von QVector benötige die Containerklasse der wahl oder sehe ich das falsch?

    Gruß
    Marco

    jsulmJ J.HilkJ 2 Replies Last reply
    0
    • T Throndar

      Hallo @jsulm,

      erstmal danke für deine Antwort.

      Im nächsten Step sollen die Clients (die ich aktuell in einer Tabelle anzeige) per Mausklick ausgewählt werden um eine Verbindung per Websocket zum entsprechenden Rechner aufzubauen. (um dann im Nachgang wenn eine Verbindung besteht z.B. Textnachrichten zu übertragen)

      Dafür müsste ich auf das jeweilige Objekt zugreifen und die Properties die das Objekt beinhaltet (Name, Adresse, Port) zum Verbindungsaufbau weiter verwenden.

      Nach dem Link wäre das QList an der Stelle auf Grund der Geschwindigkeitsvorteile und da ich nicht zwingend die aufeinanderfolgenden Speicherbereiche von QVector benötige die Containerklasse der wahl oder sehe ich das falsch?

      Gruß
      Marco

      jsulmJ Offline
      jsulmJ Offline
      jsulm
      Lifetime Qt Champion
      wrote on last edited by
      #4

      @Throndar said in Welchen Containertyp verwenden:

      Dafür müsste ich auf das jeweilige Objekt zugreifen

      Genau. Die Frage ist aber: wie? Wie identifizierst du den Client? Anhand von welchen Kriterien?

      https://forum.qt.io/topic/113070/qt-code-of-conduct

      T 1 Reply Last reply
      0
      • T Throndar

        Hallo @jsulm,

        erstmal danke für deine Antwort.

        Im nächsten Step sollen die Clients (die ich aktuell in einer Tabelle anzeige) per Mausklick ausgewählt werden um eine Verbindung per Websocket zum entsprechenden Rechner aufzubauen. (um dann im Nachgang wenn eine Verbindung besteht z.B. Textnachrichten zu übertragen)

        Dafür müsste ich auf das jeweilige Objekt zugreifen und die Properties die das Objekt beinhaltet (Name, Adresse, Port) zum Verbindungsaufbau weiter verwenden.

        Nach dem Link wäre das QList an der Stelle auf Grund der Geschwindigkeitsvorteile und da ich nicht zwingend die aufeinanderfolgenden Speicherbereiche von QVector benötige die Containerklasse der wahl oder sehe ich das falsch?

        Gruß
        Marco

        J.HilkJ Offline
        J.HilkJ Offline
        J.Hilk
        Moderators
        wrote on last edited by
        #5

        hi @Throndar ,

        wenn es darum geht sich zu entscheiden zwischen QList und QVector würde ich folgende Faustregel anwenden, zumindest mache ich das so.

        Werden Elemente nach der ursprünglichen Initialisierung einzeln entfernt oder hinzugefügt, dann QList
        Werden die Elemente nur ausgelesen oder manipuliert, dann QVector.

        Der Geschwindigkeitsunterschied ist merkbar!

        In der selben Größenordnung, wenn nicht mehr, wie der Unterschied zwischen at(x) und [x]


        Be aware of the Qt Code of Conduct, when posting : https://forum.qt.io/topic/113070/qt-code-of-conduct


        Q: What's that?
        A: It's blue light.
        Q: What does it do?
        A: It turns blue.

        T 1 Reply Last reply
        1
        • jsulmJ jsulm

          @Throndar said in Welchen Containertyp verwenden:

          Dafür müsste ich auf das jeweilige Objekt zugreifen

          Genau. Die Frage ist aber: wie? Wie identifizierst du den Client? Anhand von welchen Kriterien?

          T Offline
          T Offline
          Throndar
          wrote on last edited by
          #6

          Hallo @jsulm,

          ich bin mir noch nicht sicher wie ich auf die Tabellenelemente zugreifen kann. Der Punkt wäre der nächste auf der Liste.

          Als Möglichkeit zur Identifikation hatte ich überlegt ob ich nicht die IP Nummer, die ich ja in der Tabelle habe und diese ja einmalig ist, verwenden könnte.
          In dem Fall würde ich das Objekt theoretisch finden wenn ich per Schleife den Vector/QList durchlaufe und die IP mit der angeklickten vergleiche... wie gesagt ich weiss aktuell nicht wie das möglich ist und ob überhaupt. Möglich wäre es auch eine Art ID im Objekt anzulegen zur Kennzeichnung der Clients, wo ich wiederrum auch nicht weiss ob ich in einer Tabelle dann mit dieser ID, die ich eigentlich nicht anzeigen wollen würde, etwas anfangen kann.

          Gruß

          Marco

          jsulmJ 1 Reply Last reply
          0
          • T Throndar

            Hallo @jsulm,

            ich bin mir noch nicht sicher wie ich auf die Tabellenelemente zugreifen kann. Der Punkt wäre der nächste auf der Liste.

            Als Möglichkeit zur Identifikation hatte ich überlegt ob ich nicht die IP Nummer, die ich ja in der Tabelle habe und diese ja einmalig ist, verwenden könnte.
            In dem Fall würde ich das Objekt theoretisch finden wenn ich per Schleife den Vector/QList durchlaufe und die IP mit der angeklickten vergleiche... wie gesagt ich weiss aktuell nicht wie das möglich ist und ob überhaupt. Möglich wäre es auch eine Art ID im Objekt anzulegen zur Kennzeichnung der Clients, wo ich wiederrum auch nicht weiss ob ich in einer Tabelle dann mit dieser ID, die ich eigentlich nicht anzeigen wollen würde, etwas anfangen kann.

            Gruß

            Marco

            jsulmJ Offline
            jsulmJ Offline
            jsulm
            Lifetime Qt Champion
            wrote on last edited by jsulm
            #7

            @Throndar said in Welchen Containertyp verwenden:

            In dem Fall würde ich das Objekt theoretisch finden wenn ich per Schleife den Vector/QList durchlaufe und die IP mit der angeklickten vergleiche

            Für so etwas würde ich einfach QMap nehmen (mit IP als Schlüssel), statt jedes mal zu suchen.

            https://forum.qt.io/topic/113070/qt-code-of-conduct

            T 1 Reply Last reply
            1
            • J.HilkJ J.Hilk

              hi @Throndar ,

              wenn es darum geht sich zu entscheiden zwischen QList und QVector würde ich folgende Faustregel anwenden, zumindest mache ich das so.

              Werden Elemente nach der ursprünglichen Initialisierung einzeln entfernt oder hinzugefügt, dann QList
              Werden die Elemente nur ausgelesen oder manipuliert, dann QVector.

              Der Geschwindigkeitsunterschied ist merkbar!

              In der selben Größenordnung, wenn nicht mehr, wie der Unterschied zwischen at(x) und [x]

              T Offline
              T Offline
              Throndar
              wrote on last edited by
              #8

              Hallo @J.Hilk,

              vielen Dank für deine Rückmeldung und deinen Tipp.

              Vielleicht kannst mir sagen weswegen du auf diese Art entscheidest , auf der Seite von QT wie jsulm gepostet hatte konnte ich nicht wirklich erkennen was nun der Vorteil der jeweiligen Elemente ist (QVector <-> QList), oder gibt es Möglichkeiten zur weiteren Nutzung die es besser/einfacher/sinnvoller machen oder Funktion die ggfls nur per Vector funktionieren.

              Im Prinzip lasse ich den Vector bzw. die Liste ja nur neue Einträge hinzufügen wenn sich ein Client auf die Multicast Anfrage meldet. Entfernt werden diese erst wenn ich manuell eine neue Suche ausführen lasse, ansonnsten wird halt einzig aus dem QVector/QList vom jeweiligen ausgewählten Client die Eigenschaften gelesen.

              jsulmJ 1 Reply Last reply
              0
              • T Throndar

                Hallo @J.Hilk,

                vielen Dank für deine Rückmeldung und deinen Tipp.

                Vielleicht kannst mir sagen weswegen du auf diese Art entscheidest , auf der Seite von QT wie jsulm gepostet hatte konnte ich nicht wirklich erkennen was nun der Vorteil der jeweiligen Elemente ist (QVector <-> QList), oder gibt es Möglichkeiten zur weiteren Nutzung die es besser/einfacher/sinnvoller machen oder Funktion die ggfls nur per Vector funktionieren.

                Im Prinzip lasse ich den Vector bzw. die Liste ja nur neue Einträge hinzufügen wenn sich ein Client auf die Multicast Anfrage meldet. Entfernt werden diese erst wenn ich manuell eine neue Suche ausführen lasse, ansonnsten wird halt einzig aus dem QVector/QList vom jeweiligen ausgewählten Client die Eigenschaften gelesen.

                jsulmJ Offline
                jsulmJ Offline
                jsulm
                Lifetime Qt Champion
                wrote on last edited by jsulm
                #9

                @Throndar QList ist eine verkettete Liste, daher ist ein Zugriff über Index langsam, dafür aber einfügen/entfernen schnell.
                QVector ist ein Array, deswegen ist Zugriff über Index schnell (O(1)), allerdings einfügen/entfernen langsam, da oft Speicher neu alloziert werden muss und im schlimmsten Fall der ganze Inhalt umkopiert. Das ist in dem Link den ich vorher geposted habe beschrieben.

                https://forum.qt.io/topic/113070/qt-code-of-conduct

                1 Reply Last reply
                1
                • jsulmJ jsulm

                  @Throndar said in Welchen Containertyp verwenden:

                  In dem Fall würde ich das Objekt theoretisch finden wenn ich per Schleife den Vector/QList durchlaufe und die IP mit der angeklickten vergleiche

                  Für so etwas würde ich einfach QMap nehmen (mit IP als Schlüssel), statt jedes mal zu suchen.

                  T Offline
                  T Offline
                  Throndar
                  wrote on last edited by
                  #10

                  Hallo @jsulm,

                  danke für die Antwort aber eine Frage hab ich da jetzt...

                  @jsulm said in Welchen Containertyp verwenden:

                  Für so etwas würde ich einfach QMap nehmen (mit IP als Schlüssel), statt jedes mal zu suchen.

                  an der Stelle hast du mich jetzt verwirrt. Ich dachte bisher immer das QMap immer zwei Werte Paarweise speichert, das könnte ich für meine Clients bei drei Werten nicht nutzen.

                  Oder meinst du eine QMap nutzen in der die jeweiligen IP (String) und dazugehörige Indexnummer (Integer) des Vector<Client> hinterlegt ist um die Schleife zu sparen?

                  Gruß

                  Marco

                  jsulmJ 1 Reply Last reply
                  0
                  • T Throndar

                    Hallo @jsulm,

                    danke für die Antwort aber eine Frage hab ich da jetzt...

                    @jsulm said in Welchen Containertyp verwenden:

                    Für so etwas würde ich einfach QMap nehmen (mit IP als Schlüssel), statt jedes mal zu suchen.

                    an der Stelle hast du mich jetzt verwirrt. Ich dachte bisher immer das QMap immer zwei Werte Paarweise speichert, das könnte ich für meine Clients bei drei Werten nicht nutzen.

                    Oder meinst du eine QMap nutzen in der die jeweiligen IP (String) und dazugehörige Indexnummer (Integer) des Vector<Client> hinterlegt ist um die Schleife zu sparen?

                    Gruß

                    Marco

                    jsulmJ Offline
                    jsulmJ Offline
                    jsulm
                    Lifetime Qt Champion
                    wrote on last edited by jsulm
                    #11

                    @Throndar So etwas:

                    QMap<QString, Client> clients;
                    // Oder
                    QMap<QString, Client*> clients;
                    

                    Hier QString ist der Schlüssel (IP, oder was auch immer) und Client ist die Structur/Classe die den dazugehörigen Client representiert. Ich wüsste nicht wieso das ein Vector<Client> sein sollte, es sei denn pro Schlüssel kann es mehr als einen Client geben (da kann man aber auch http://doc.qt.io/qt-5/qmultimap.html nehmen). Ich habe ja QMap vorgeschlagen, da man damit schnell einen Client anhand von einem Schlüssel identifizieren kann statt in einem QVector/QMap zu suchen. Eigentlich wäre QHash sogar noch efizienter. Hier http://doc.qt.io/qt-5/containers.html#algorithmic-complexity gibt es Details.
                    Wie schon vorher gesagt, welcher Container der richtige ist hängt vom Usecase ab. Unter anderem wie auf die Elemente zugegriffen werden soll. Man sollte also zuerst diese Frage beantworten, bevor man sich für einen Container entscheidet.

                    https://forum.qt.io/topic/113070/qt-code-of-conduct

                    T 1 Reply Last reply
                    2
                    • jsulmJ jsulm

                      @Throndar So etwas:

                      QMap<QString, Client> clients;
                      // Oder
                      QMap<QString, Client*> clients;
                      

                      Hier QString ist der Schlüssel (IP, oder was auch immer) und Client ist die Structur/Classe die den dazugehörigen Client representiert. Ich wüsste nicht wieso das ein Vector<Client> sein sollte, es sei denn pro Schlüssel kann es mehr als einen Client geben (da kann man aber auch http://doc.qt.io/qt-5/qmultimap.html nehmen). Ich habe ja QMap vorgeschlagen, da man damit schnell einen Client anhand von einem Schlüssel identifizieren kann statt in einem QVector/QMap zu suchen. Eigentlich wäre QHash sogar noch efizienter. Hier http://doc.qt.io/qt-5/containers.html#algorithmic-complexity gibt es Details.
                      Wie schon vorher gesagt, welcher Container der richtige ist hängt vom Usecase ab. Unter anderem wie auf die Elemente zugegriffen werden soll. Man sollte also zuerst diese Frage beantworten, bevor man sich für einen Container entscheidet.

                      T Offline
                      T Offline
                      Throndar
                      wrote on last edited by
                      #12

                      Hallo @jsulm,

                      vielen Dank für deine Erklärung.

                      Ich lese jetzt erstmal die ganzen Links die du mir gepostet hast und werde anschließend Schauen was ich am sinnvollsten nutzen kann.

                      Vielen Dank

                      Marco

                      1 Reply Last reply
                      0

                      • Login

                      • Login or register to search.
                      • First post
                        Last post
                      0
                      • Categories
                      • Recent
                      • Tags
                      • Popular
                      • Users
                      • Groups
                      • Search
                      • Get Qt Extensions
                      • Unsolved