Ergebnis 1 bis 5 von 5

Thema: QT Multimap

  1. #1
    Registered User
    Registriert seit
    Oct 2007
    Beiträge
    246
    Renommee
    234

    QT Multimap

    Hallo,
    vlt ist die Frage auch einfach, aber ich komme nicht drauf.

    Ich will in QT ein Liste erzeugen. Diese Liste soll eine weitere Liste enthalten, welche auch leer sein kann.

    var[1] << 1;
    var[2] << 2;
    var[2] << 3;

    jetzt ist die Erwartung: var[0]= {}, var[1] = {1} und var[2] = {2, 3}

    Welche Klasse verwendet man hierbei am besten? Oder soll ich mir selber eine LinkedList erstellen?

    QList, QMap haben das verhalten, dass kein Array zurückgegeben wird, sondern die Keys einfach mehrfach belegt werden.
    Ausgabe wäre wie oben:
    var[1] << 1;
    var[2] << 2;
    var[2] << 3;

  2. #2
    Moderator
    Registriert seit
    Aug 2004
    Beiträge
    1.310
    Renommee
    1286

    AW: QT Multimap

    Eigentlich sollte QMap mit dem [] Operator eine Referenz auf den Value zurückgeben. Für eine QMap<int,QVector> sollte das eine Referenz auf den QVector sein, der über den Streaming-Operator befüllt werden kann. Dein einziges "Problem" wäre dann, dass der Aufruf über [] automatisch einen Eintrag mit einem leeren QVector erstellt.

    Hab ich das richtig verstanden, dass das so nicht funktioniert?

  3. #3
    Registered User
    Registriert seit
    Oct 2007
    Beiträge
    246
    Renommee
    234

    Post AW: QT Multimap

    Hier mal meine Implementierung, sowie der Output

    Code:
    QMap <int, QMap <int, int> > list;
    
    void create_map()
    {
        for(i = 0; i <= 3; i++)
        {
            printf("i: %d\n", i);
            for(j = 0; j <= i; j++)
            {
                QMap <int, int> tmp;
                if(i <= j)
                {
                    tmp.insert(i,j);
                }
                else
                {
                    tmp.insert(j,i);
                }
                product = (i * j) & (0x03);
                printf("  j: %d = > %d\n", j, product);
                list.insertMulti(product, tmp);
            }
        }
    }
    PHP-Code:
    i0
      j
    = > 0
    i
    1
      j
    = > 0
      j
    = > 1
    i
    2
      j
    = > 0
      j
    = > 2
      j
    = > 0
    i
    3
      j
    = > 0
      j
    = > 3
      j
    = > 2
      j
    = > 

    die Auslesefunktion

    Code:
    void stats()
    {
        QMapIterator <int, QMap <int, int> > i(list);
        int hash;
    
        printf("Map Size: %d\n", list.size());
    
        while (i.hasNext())
        {
            i.next();
            hash = i.key();
            QMapIterator <int, int> j(i.value());
    
            printf("0x%04x:", hash);
    
            while (j.hasNext())
            {
                j.next();
                printf(" [ %02x / %02x ] | [ %04d / %04d]", j.key(), j.value(), j.key(), j.value());
            }
            printf("\n");
        }

    PHP-Code:
    Map Size10
    0x0000
    : [ 00 03 ] | [ 0000 0003]
    0x0000: [ 02 02 ] | [ 0002 0002]
    0x0000: [ 00 02 ] | [ 0000 0002]
    0x0000: [ 00 01 ] | [ 0000 0001]
    0x0000: [ 00 00 ] | [ 0000 0000]
    0x0001: [ 03 03 ] | [ 0003 0003]
    0x0001: [ 01 01 ] | [ 0001 0001]
    0x0002: [ 02 03 ] | [ 0002 0003]
    0x0002: [ 01 02 ] | [ 0001 0002]
    0x0003: [ 01 03 ] | [ 0001 0003
    Erwarten würde ich folgendes, da die Variable "j" als Array ausgelegt sein muss.
    PHP-Code:
    Map Size10
    0x0000
    : [ 00 03 ] | [ 0000 0003]
    02 02 ] | [ 0002 0002]
    00 02 ] | [ 0000 0002]
    00 01 ] | [ 0000 0001]
    00 00 ] | [ 0000 0000]
    0x0001: [ 03 03 ] | [ 0003 0003]
    01 01 ] | [ 0001 0001]
    0x0002: [ 02 03 ] | [ 0002 0003]
     [ 
    01 02 ] | [ 0001 0002]
    0x0003: [ 01 03 ] | [ 0001 0003

  4. #4
    Moderator
    Registriert seit
    Aug 2004
    Beiträge
    1.310
    Renommee
    1286

    AW: QT Multimap

    Das Problem ist, dass du insertMulti verwendest, um den neuen Wert einzutragen. In der Doku steht nämlich, dass einfach ein neuer Eintrag erstellt wird, egal ob es schon einen mit dem gleichen Wert gibt.

    Inserts a new item with the key key and a value of value.
    If there is already an item with the same key in the map, this function will simply create a new one. (This behavior is different from insert(), which overwrites the value of an existing item.)
    Damit fügst du also nichts an deinen vorhandenen Value an, sondern erstellst ein neues Key/Value-Paar.

    Probier mal folgenden Code zum Befüllen der "Map-Map"
    PHP-Code:
    product = (j) & (0x03);
    if(
    <= j)
    {
        list[
    product].insert(i,j);
    }
    else
    {
        list[
    product].insert(j,i);
    }
    printf("  j: %d = > %d\n"jproduct); 
    Natürlich hast du dann in der inneren Map wieder das Problem, dass Einträge mit dem gleichen Key überschrieben werden.

  5. #5
    Registered User
    Registriert seit
    Oct 2007
    Beiträge
    246
    Renommee
    234

    AW: QT Multimap

    Danke für deine Anregung.
    Die Lösung ist noch einfacher:

    PHP-Code:
    //list.insertMulti(product, tmp);
    list[product].insertMulti(i,j); 

Aktive Benutzer

Aktive Benutzer

Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)

Ähnliche Themen

  1. std::multimap und BubbleSort
    Von the-WebCoder im Forum C / C++
    Antworten: 1
    Letzter Beitrag: 16.10.2003, 18:14

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •