Vektoren: Gleiche Einträge löschen?



  • Hallo,
    ich habe einen Vektor, den ich gerne noch einmal in Vektoren "aufsplitten" möchte.

    Die einzelnen Elemente sehen bis nun so aus:

    vektor[0] -> test1a|test1b
    vektor[1] -> test2a|test2b
    vektor[2] -> test3a|test3b
    

    Sie sollen nachher so aussehen:

    vektor[0][0] -> test1a
    vektor[0][1] -> test1b
    vektor[1][0] -> test2a
    vektor[1][1] -> test2b
    vektor[2][0] -> test3a
    vektor[2][1] -> test3b
    

    Das soll aber möglichst effizient sein.
    Danke!!



  • wozu brauchst du das?

    was spricht dagegen, es von anfang an so abzuspeichern?

    welche typen haben test1a / test1b ?
    sind noch andere objekte in der klasse gespeichert?

    bb



  • Da brauchst du einen anderen Typen. Z.B sowas:

    std::vector<std::vector<int> > v;
    ...
    std::vector<int> v1;
    std::vector<int> v2;
    std::vector<int> v3;
    
    v1.push_back (11);
    v1.push_back (12);
    v1.push_back (13);
    
    v2.push_back (11);
    v2.push_back (22);
    v2.push_back (23);
    
    v3.push_back (31);
    v3.push_back (32);
    v3.push_back (33);
    ...
    
    v.push_back (v1);
    v.push_back (v2);
    v.push_back (v3);
    


  • @unskilled: Leider bekomme ich die Werte genau so vorgegeben (von einem anderen Programm) und ich muss sie dann auswerten 😞

    @drakon: So ähnlich sah mein Ansatz auch aus, nur hat das bei den vielen Datensätzen sehr, sehr viel Zeit in Anspruch genommen(, bis ich dann erst zum eigentlichen Auswerten komme). Gibt es da nicht noch etwas geschickteres?



  • Achja, der Datentyp, den ich dafür benutze, ist std::string...



  • Das klingt so, als hättest du std::vector lediglich im Debug Mode gebraucht. Im optimierten Modus bist du viel schneller.

    Im übrigen könnte man auch noch evaluieren, welchen Container du am besten benutzt, denn, wenn du viele Einfüge/Lösch Operationen hast, dann ist std::vector denkbar ungeeignet. (vlt. eher eine std::list? oder std::deque?)

    Sie dazu z.B hier:
    http://stackoverflow.com/questions/471432/in-which-scenario-do-i-use-a-particular-stl-container

    EDIT:
    Achja.. std::string ist sehr aufwändig bei vielem kopieren. Vlt. geht auch was anderes?



  • ich geh mal (frecherweise^^) davon aus, dass du den alten container danach nicht mehr brauchst!?
    string hat ne fkt swap (Laufzeit O(1)) - also kannst du die strings einfach swappen:

    struct data
    {
      std::string a;
      std::string b;
    };
    
    std::vector<data> old = strange_function();
    
    std::vector<std::string> new_one(old.size());
    std::vector<std::string> new_two(old.size());
    
    for(std::vector<std::string>::size_type i(0), e(old.size()); i != e; ++i)
    {
      old[i].a.swap(new_one[i]);
      old[i].b.swap(new_two[i]);
    }
    

    sehr viel schneller geht es imho nicht...
    das swappen+schleife könnte man jetzt noch in ne fkt packen und dann mit transform abstrahieren - aber das ändert (vermutlich) nichts an der laufzeit max. an der wartbarkeit, die dadurch zumindest in meinen augen nicht signifikant erhöht wird...

    btw: Vector hört sich hier (für mich) durchaus sinnvoll an...

    bb


Anmelden zum Antworten