CObList<>vector



  • bin coblist gewohnt, will aber jetzt mal vector einsetzen.
    gibts irgendwelche wichtigen unterschiede in der benutzung die ich wissen sollte?



  • Wenn Du uns sagst was CObject list ist ... 🤡



  • Hallo,
    die wichtigsten beiden Unterschiede dir mir einfallen:

    1. COblist arbeitet einheitlich mit CObject. Elemente der Liste müssen also von dieser Klasse erben. Daraus folgt auch, dass COblist standardmäßig ein heterogener Container sein kann. Holst du Objekte aus der Liste, musst du sie wieder in den passenden Typ casten.

    std::vector hingegen ist ein Template und damit stark typisiert. Er fordert von seinen Elementen nur, dass sie kopierbar sind.
    (mit std::vector<CObject*> erhälst du einen zu COblist ähnlichen Container)

    2. COblist enthält Pointer also Referenzen auf die eingefügten Objekte. std::vector hingegen Werte also Kopien der eingefügten Objekte.

    Mehr kann ich dir nicht sagen, da ich mich mit der MFC nicht so auskenne.



  • ok noch n paar fragen
    -verändern sich zeiger auf elemente innerhalb der liste(dumme frage wenn die liste eh nur kopien rausgibt ;))
    -werden die objekte mit clear gelöscht (coblist löscht nur die zeiger, nich die objekte selber)
    -braucht vector zwingend ein head und ein tail bevor versucht wird per schleife alle elemente zu durchlaufen (coblist-ja)

    nett wär noch wenn ihr den folgenden code als vector umschreiben könntet

    CObList List;
    
    List.AddHead(new CObject);
    List.AddTail(new CObject);
    
    CObject *tmpObj;
    for(POSITION i=List.GetHeadPosition();i!=List.GetTailPosition();)
       tmpObj=List.GetNext(i);
    


  • Sovok schrieb:

    CObList List;
    
    List.AddHead(new CObject);
    List.AddTail(new CObject);
    
    CObject *tmpObj;
    for(POSITION i=List.GetHeadPosition();i!=List.GetTailPosition();)
       tmpObj=List.GetNext(i);
    
    vector<CObject> list; //uU willst du lieber eine list als einen vector?
    
    //was AddHead und AddTail machen, weiss ich nicht. ich nehme mal an, sie inserten einfach
    //vorne und hinten
    //folglich waere list wohl besser als vector
    
    list.push_front(CObject());
    list.push_back(CObject());
    
    for(vector<CObject>::iterator i=list.begin(); i!=list.end(); ++i)
    {
      CObject t=*i;
    }
    


  • Shade Of Mine schrieb:

    //uU willst du lieber eine list als einen vector?

    wie meinen? 🙄

    Shade Of Mine schrieb:

    //was AddHead und AddTail machen, weiss ich nicht. ich nehme mal an, sie inserten einfach
    //vorne und hinten
    //folglich waere list wohl besser als vector

    //is der code ohne head und tail gültig? :

    vector<CObject> list; 
    for(vector<CObject>::iterator i=list.begin(); i!=list.end(); ++i)
      CObject t=*i;
    


  • Sovok schrieb:

    //is der code ohne head und tail gültig? :

    vector<CObject> list; 
    for(vector<CObject>::iterator i=list.begin(); i!=list.end(); ++i)
      CObject t=*i;
    

    Ja. list.begin() gibt halt sofort einen Iterator zurück, der gleich list.end() ist, so dass die Schleife sofort abbricht. BTW list != vector, ich find das etwas verwirrend einen vector list zu nennen 😉



  • Sovok schrieb:

    Shade Of Mine schrieb:

    //uU willst du lieber eine list als einen vector?

    wie meinen? 🙄

    vector == array
    list == verkettete liste



  • Shade Of Mine schrieb:

    Sovok schrieb:

    Shade Of Mine schrieb:

    //uU willst du lieber eine list als einen vector?

    wie meinen? 🙄

    vector == array
    list == verkettete liste

    dann passts ja
    ich portier grad vb code und hab die dynamischen arrays durch vector ersetzt


Anmelden zum Antworten