Problem mit Pointer auf Pointer



  • so wie ich das programm verstanden habe, ist die anzahl der strings unbekannt. deshalb ist vector die falsche datenstruktur dafür.



  • Das ist aber kein Argument für list, auch vector ist problemlos erweiterbar.
    Kennst du das hier?
    http://stackoverflow.com/questions/471432/in-which-scenario-do-i-use-a-particular-stl-container



  • Eigentlich sind Vector und List nicht die Antwort auf die Frage, auch wenn das nach der reinen Lehre guter C++ Stil ist. Wenn man die ursprüngliche Frage beantworten will geht das in etwa so:

    #include <iostream>
    #include <string>
    
    int main(){
    
    	const int numStr = 10;
    	const int maxStrLen = 25;
    	const wchar_t *p[] = {L"Fred", L"Wilma", L"BamBam"};
    	const int numInpStr = sizeof(p) / sizeof(*p);
    
    	//Array allokieren und String einfügen
        wchar_t **str = new wchar_t*[numStr];
    	for(int i = 0; i < numInpStr; i++){
    		str[i] = new wchar_t[maxStrLen];
    		wcscpy(str[i],*(p+i));
    	}
    
    	//Ausgeben und aufrauemen
    	for( int i = 0 ; i < numInpStr; i++ ){
    		std::wcout << *(str+i) << std::endl;
    		delete[] str[i];
    	}
    	delete[] str;
    
    	return 0;
    }
    

    Auch wenn mich die C++ Puristen im Forum für so ein Coding steinigen würden finde ich Zeiger auf Zeichenketten eine der besten Übungen um den Umgang mit Zeigern zu lernen :).



  • Braunstein schrieb:

    Das ist aber kein Argument für list, auch vector ist problemlos erweiterbar.

    naja, ich sehe das sehr wohl als argument für list. so problemlos, wie die api es suggeriert, ist vector nicht erweiterbar. aber man kann ja verschiedener meinung sein. die url habe ich nicht gekannt. schaut recht nett aus, auch wenn ich nicht immer der gleichen meinung bin. 🙂



  • besserwisser schrieb:

    naja, ich sehe das sehr wohl als argument für list. so problemlos, wie die api es suggeriert, ist vector nicht erweiterbar.

    Worin bestehen dann deiner Ansicht nach die Probleme bei std::vector ?



  • das hinzufügen eines elements hat die komplexität O(n) im schlechtesten fall. vector ist nun mal nicht für sowas gedacht. bei kleinen werten mag das bedeutungslos sein, bei größeren aber nicht. ich hab aber schon oft erlebt, dass leute vector für kleine werte lernen und es für große weiter verwenden.



  • Du meinst also, std::vector wäre nicht als dynamischer Container zu gebrauchen, weil man Reallokationen riskiert? 🙄

    • Was ist, wenn man Random Access braucht? Den bietet std::list nicht.
    • Bei std::list ist das Hinzufügen zwar gleichmässig (nämlich O(1)), aber es ist auch gleichmässig langsam, weil Speicheranforderung viel Zeit braucht. std::vector hingegen kann viel auf einmal anfordern.
    • Drittens gibt es die Funktion std::vector::reserve() , mit der man vorallokieren kann.
    • Viertens sollte man solche Kriterien eigentlich eher beachten, wenn man wirklich weiss, welche Operationen auf der Datenstruktur gemacht werden. Aber im Voraus zu sagen, std::vector sei schlecht, man nehme besser std::list , ist etwas fragwürdig.


  • Die Realloc-Strategie von std::vector ist etwas komplizierter, aber besser. Wenn der Container nicht mehr genug Platz bietet, dann werden nicht einfach N+1 Zellen allokiert und der alte Inhalt kopiert, sondern 2*N. Dadurch sind die Kosten fuer das Anhaengen eines Elements amortisiert O(1). Siehe http://www.sgi.com/tech/stl/Vector.html unter Notes [3].



  • es ist ansichtssache zum teil. ich denke, dass list besser geeignet ist für die aufgabe. jeder, der vector bevorzugt, soll dabei bleiben.

    Was ist, wenn man Random Access braucht? Den bietet std::list nicht.

    wenn er das braucht, muss man sich was anderes überlegen. vector könnte hier nützlich sein. davon stand aber nichts im posting. oder ich habe es übersehen.

    Bei std::list ist das Hinzufügen zwar gleichmässig (nämlich O(1)), aber es ist auch gleichmässig langsam, weil Speicheranforderung viel Zeit braucht. std::vector hingegen kann viel auf einmal anfordern.

    speicheranforderungen sind mittlerweile auch nicht mehr so langsam. du hast aber recht, dass das ein problem jeder datenstruktur, die elemente in einem baum speichert, ist.

    Drittens gibt es die Funktion std::vector::reserve(), mit der man vorallokieren kann.

    wenn man einen anhaltspunkt für die größe hat, bringt das viel. hat man den nicht, kann man nur raten. das halte ich für ungünstig. die gleiche aussage steht übrigens auch auf der webseite, die knivil gepostet hat.

    Aber im Voraus zu sagen, std::vector sei schlecht, man nehme besser std::list, ist etwas fragwürdig.

    da stimme ich dir vollkommen zu. ich habe mich auf die informationen gestützt, die ich hatte. ich habe ja auch keinesfalls behauptet, dass list immer besser als vector wäre.

    Du meinst also, std::vector wäre nicht als dynamischer Container zu gebrauchen, weil man Reallokationen riskiert?

    die aussage ist zu pauschal. wenn ich die features von vector brauche, die list nicht bietet, und zusätzlich grundsätzlich eher eine stabile menge an elementen verwendet wird, ist vector sicher sinnvoll. bei einer anwendung, die explizit auf einer unbekannten anzahl an elementen basiert, halte ich list für besser geeignet.



  • Hallo zusammen,

    da schau ich nach meiner Frage zwei Tage nicht ins Forum und bin über die Anzahl der Antworten doch recht überascht. Der Grund meines Postings hatte nichts mit Geschwindigkeitsoptimierung o.ä. zu tun. Mir ging es einfach nur darum wie man mal einen Pointer auf Pointer einsetzen kann. LIST und VECTOR können da einem gut unter die Arme greifen, aber ich möchte schon verstehen wie Sie funktionieren und nicht nur anwenden. Ich danke jedem für seinen Beitrag und hoffe, dass die Diskusion noch ein wenig fortgeführt wird.

    Bis denn
    JFisch



  • Was willst du denn jetzt noch wissen?
    Die allgemeine Funktionsweise von Listen kannst du durch google finden und/oder mal in die Implementierung schauen, welche dein Compiler benutzt.



  • besserwisser schrieb:

    da stimme ich dir vollkommen zu. ich habe mich auf die informationen gestützt, die ich hatte. ich habe ja auch keinesfalls behauptet, dass list immer besser als vector wäre.

    Ja, so sehe ich das auch. Dann habe ich deine Beiträge wohl etwas falsch interpretiert.

    JFisch schrieb:

    da schau ich nach meiner Frage zwei Tage nicht ins Forum und bin über die Anzahl der Antworten doch recht überascht.

    Das kommt noch ab und zu vor, dass es zu Diskussionen kommt, die mit dem ursprünglichen Thema nicht mehr viel zu tun haben. 🙂

    JFisch schrieb:

    LIST und VECTOR können da einem gut unter die Arme greifen, aber ich möchte schon verstehen wie Sie funktionieren und nicht nur anwenden. Ich danke jedem für seinen Beitrag und hoffe, dass die Diskusion noch ein wenig fortgeführt wird.

    std::list und std::vector ist nicht alles. Es gibt noch andere Container der Standardbibliothek. Aber selbst die decken noch lange nicht alle Möglichkeiten ab. Da gibt es beispielsweise noch etliche in Boost...

    Vielleicht kannst du auch den Artikel über die STL lesen, dort werden die Standardcontainer einander gut gegenübergestellt. Am Schluss hat man eine übersichtliche Tabelle, in der beschrieben ist, welcher Container wo seine Stärken und Schwächen hat.


Anmelden zum Antworten