warum hat std::vector...



  • listenoperationen aber std:: list keine vectoroperationen...
    vector hat ja methoden wie z.b. insert oder erase, diese haben aber infolge dessen, dasd der speicher dahinter kopiert/verschoben werden muss eine komplexität von N (bei list 1 ).
    aber list hat keine at() oder [] operator. das bräuchte ja auch nur lineare laufzeit.
    jetzt bin ich natürlich nicht der, meinung man sollte list einen [] operator verpassen. aber warum hat vector diese listenoperationen?
    wäre es nicht intelligenter diese operatonen in extra funktionen auszulagern (also quasi in <algorithm> )? weil so wirkt es irgendwie als wäre insert eine operaton die man ohne weitere performance verluste auf vectoren anwenden könnte...

    (ich mach mir gedanken darüber weil ich grad selber ne kleine lib schreibe die an die stl angelehnt ist aber nicht identisch und da hab ich halt eine dynamic_array klasse, die ähnlichkeiten mit vector hat aber sozusagen etwas "konkreter" ist. d.h. sie kann nichts was für ein array nicht sinnvoll ist, push_front etc.)

    mfg japro

    [ Dieser Beitrag wurde am 16.05.2003 um 22:03 Uhr von japro editiert. ]



  • Hallo,
    die Container-Klassen der STL bieten eine kleine Teilmenge an Operationen die für alle Container gleich (mit kleinen Ausnahmen) sind. Dazu gehört eine Operation zum Einfügen (insert) und eine zum Löschen (erase). Die sequentiellen Container bieten zusätzlich alle noch eine Operation zum anhängen (push_back).
    Dadurch wird es möglich Container in manchen Situationen frei austauschbar zu machen (auch wenn das selten sinnvoll ist).
    Eine Antwort ist also: Weil "minimale Teilmenge an gleichen Operationen" ein Designziel war.

    wäre es nicht intelligenter diese operatonen in extra funktionen auszulagern

    Dann bräuchten diese Funktionen aber intime Kentnisse über den drunterliegenden Container.



  • ich meine damit eigentlich, dass z.b. list insert erase und so hat
    aber für alle anderen sequenziellen datenstrukturen für die das nicht sinnvoll zu definiere ist (vector) eine version als funktion vorliegt. die nicht auf das interen zeugs des containers zugrieft sondern halt nach dem muster grösse ändern nach hinten scheiben neue elemente reinkopieren funktioniert oder so.



  • Weil "minimale Teilmenge an gleichen Operationen" ein Designziel war.



  • hmmm, das leuchtet schon ein aber treibt man das nicht ab dem moment zu weit wo manche operationen einfach nicht zu einem objekt passen.
    eine list und ein vector sind soo verschieden, auch wenn sie beide sequenz contianer sind.
    wo eine list gut ist ist ein vector ziemlich sicher mist
    und umgekehrt gilt das auch.
    das einzige was man auf beiden gleich sinnvoll machen kann ist sie durchlaufen und dafür hat man ja iteratoren...

    mir kommt einfach an der stelle vor als wär da so eine art knacks in der stl wo man versucht hat zu stark auf ähnliche schnittstellen zu achten...
    und falls man doch mal ein insert auf nem vector braucht sollte das, meiner meinung nach, jedenfalls nicht so einfach sein. sondern man sollte schon beim implementieren bemerken das man sich hier eigentlich vergeht...

    so schlagt mich 😃

    [ Dieser Beitrag wurde am 17.05.2003 um 14:48 Uhr von japro editiert. ]



  • mir kommt einfach an der stelle vor als wär da so eine art knacks in der stl

    jo. knacks entdeckt. davon gibts etliche. und genau das macht dein vorhaben wirklich spannend. ich würds an deiner stelle versuchen, die schnittstellen anders zu machen. nur die sachen rein in den container, die er jeweils gut kann. und hoffen, daß es klappt.
    man weiß bei so nem knacks nie vorher, obs nur ein versehen ist, oder obd echt sinnvoll ist.



  • bei insert und erase würde ich sagen, hat es einen plausiblen grund: ein globales erase müsste überladen werden, das zu erreichen. und zwar nach charakteren. manchmal (wenn auch extrem selten) muss man halt in einen vector inserten....



  • Original erstellt von Mr. N:
    bei insert und erase würde ich sagen, hat es einen plausiblen grund: ein globales erase müsste überladen werden, das zu erreichen. und zwar nach charakteren.

    wenn man die seqzenz zwischen a und b erasen will dann kopiert man einfach alles hinter b nach a und resized den container...(was anderes macht vector ja auch nicht)



  • ein vector ohne insert ist naja, es stimmt schon das insert passt nicht zu einen dynamichen array
    aber ich erinnern mal an loki::AssocVector,

    c++ ist doch keine sprache wo wir uns bevormunden lassen sollten,

    zu der idee mit funktionen

    • es bringt unnötige komplexität mit hinein, bei einer methode ist es klar geregelt wer zu wen gehört
    • die ides sind noch nicht so weit
    • es gibt vielleicht intern ein weg wie es effizienter geht und friend funktion mag ich nicht

    ich würde einfach in der dokumentation zu insert eine grafik einfügen die den speed unterscheid zeigt zwischen list usw.



  • ich bin sogar der Meinung dass std::list einen op[] haben sollte - ganz einfach weil es mal sinnvoll sein kann
    list[5]
    statt
    for(int i=0;i<5;++i)
    ++it;

    zu schreiben.

    welche operationen schnell sind muss man dann selber wissen, aber warum sollte man nicht erase() verwenden sondern mit einem std::copy arbeiten? das versteht dann ja keiner mehr - die lesbarkeit sinkt drastisch, die fehleranfälligkeit erhöht sich.



  • Original erstellt von Shade Of Mine:
    **
    for(int i=0;i<5;++i)
    ++it;
    **

    guck dir mal advance an



  • Original erstellt von Shade Of Mine:
    **
    welche operationen schnell sind muss man dann selber wissen, aber warum sollte man nicht erase() verwenden sondern mit einem std::copy arbeiten? das versteht dann ja keiner mehr - die lesbarkeit sinkt drastisch, die fehleranfälligkeit erhöht sich.**

    ich mein das eigentlich etwa so:

    template<class container, class iterator>
    iterator erase(container cont, iteartor start, iterator end)
    {
       copy(end, cont.end(), start);
       cont.resize(cont.size()-(end-start));
       return start;
    }
    

    (der code ist sucher ultrabuggy hab den nur mal so eben in den browsergehakt umd zu illustrieren wie ich das meine)
    also das so zusagen alle funktionen die für eine datestruktur sinnvoll sind als member vorhanden sind (eben z.b. insert erase für list) und für z.b. vector schreibe ich dann halt:
    erase(meinvector, vonhier, bisda);

    [ Dieser Beitrag wurde am 17.05.2003 um 21:04 Uhr von japro editiert. ]

    [ Dieser Beitrag wurde am 17.05.2003 um 21:05 Uhr von japro editiert. ]


Anmelden zum Antworten