alphabetisches Sortieren von Wörtern



  • So geht das aber nicht, das resize musst du mitmessen.

    steady_clock::time_point t1 = steady_clock::now();
    
    #ifdef RESIZE 
    
      vector.resize(COUNT);
    
      for (std::size_t i = 0; i < COUNT; ++i)
        vector[i] = std::rand();
    
    #else
    
      vector.reserve(COUNT);
      for (std::size_t i = 0; i < COUNT; ++i)
        vector.push_back(std::rand());
    
    #endif
    
      steady_clock::time_point t2 = steady_clock::now();
    
    resize: 0.30115
    reserve: 0.292639
    

    Ich würde aber immer push_back verwenden, weil resize ist nicht exception-neutral.



  • OK, das mitgemessen habe ich bei beiden: 0.2495 ^^

    Edit: und push_back() ist nur exception-neutral, solange kein neuer Speicher angefordert werden muss.
    Ein Vorschlag: Wir einigen uns auf deque für stark-wachsende Arrays.



  • ... Und Du kisst die ganze Zeit den Aufruf für rand() mit. Das musst Die azeit musst Du mch separät messen und davon subtrahieren.



  • bist_du_sone? schrieb:

    kaenzign schrieb:

    Jetzt funktioniert es natürlich

    Toll, jetzt kann man nach Alternativen suchen:

    struct line : std::string {};
    std::istream& operator>>(std::istream& in, line& l) { return getline(in, l); }
    
    int main()
    {
      std::ifstream in("data.txt");
      std::vector<std::string> lines(std::istream_iterator<line>(in),
                                     std::istream_iterator<line>{});
      std::sort(lines.begin(), lines.end());
      std::copy(lines.begin(), lines.end(),
                std::ostream_iterator<std::string>(std::cout, "\n"));
    }
    

    Hätte da ein paar Fragen dazu 🙂
    1. Was bedeutet der ':' in der ersten Zeile?
    2. Warum überladest du zuerst den '>>'-Operator und verwendest ihn dann nicht in der Main funktion?
    3. Das 3te Argument der copy()-Fkt. (letzte Zeile) ist ein Konstruktor der Klasse "ostream_iterator" oder? Muss man für den Auruf eines Konstruktors nicht zuerst ein Objekt der Klasse erstellen, auf das er ausgeführt werden soll?
    Also z.B.

    std::ostream_iterator<std::string> it(std::cout, "\n"));
    

    oder die lange Version:

    std::ostream_iterator<std::string> it = ostream_iterator(std::cout, "\n")
    


  • 1. Das : bedeutet, dass line von std::string erbt. Lies einfach weiter in deinem Buch/Tutorial mit dem du C++ lernst.
    2. Der ostream_iterator braucht den << Operator um das auszugeben.
    3. Nein, man kann auch einen temporären Wert übergeben.





  • ...



  • Mit der Theorie der Vererbung bin ich eigentlich schon einigermassen vertraut, mit der praktischen Anwendung jedoch überhaupt nicht.
    Was bezweckst du denn hier mit dem Erben von String?

    PS: Gibt es irgendeine Seite, wo man nachschauen kann, wie alle Klassen, Funktionen, etc. von den vorgegebenen C++ Libraries implementiert sind?



  • Die Implementierung ist zum Teil compiler-abhängig.
    Eine Übersicht über das, was du als Anwender brauchst, findest du z.B. hier:
    http://www.cplusplus.com/reference/



  • Siehe bitte http://www.c-plusplus.net/forum/310212 unter Referenzen. Falls du dich wirklich für die technische Umsetzung der Funktionen interessierst, kannst du jederzeit die Header öffnen oder anzeigen lassen. In Buchempfehlungen gibt's bestimmt auch Einiges, das man als Referenz nehmen kann. Mein Tipp: "The C++ Standard Library" von Josuttis



  • kaenzign schrieb:

    1. Was bedeutet der ':' in der ersten Zeile?
    2. Warum überladest du zuerst den '>>'-Operator und verwendest ihn dann nicht in der Main funktion?
    3. Das 3te Argument der copy()-Fkt. (letzte Zeile) ist ein Konstruktor der Klasse "ostream_iterator" oder? Muss man für den Auruf eines Konstruktors nicht zuerst ein Objekt der Klasse erstellen, auf das er ausgeführt werden soll?

    1. Das ist ein übler Hack um mit operator>> eine ganze Zeile auslesen zu können. operator>> brauche ich, um den istream_iterator verwenden zu können.
    Ich weiss, dass da der fehlende virtuelle Destruktor, das Slicing und all die weiteren Probleme keine Rolle spielen. Mach das bitte nicht nach bis du dich damit auskennst. Das ist eine Zwecksentfremdung.
    2. Der ist für den istream_iterator
    3. Konstruktoren kann man auch ohne Namen aufrufen. Zum Beispiel so (kennst du vielleicht)

    string s = string("hallo");
    

Anmelden zum Antworten