Liste mit maps sortieren



  • Hups, was @wob sagt. Und, std::sort ist im Header <algorithm>



  • @wob

    ich verstehe nur Bahnhof. Also ich habe jetzt eine dedizierte sort-Funktion

    bool title_sort(map<string,string>& a, map<string, string>& b){
        return a["title"] < b["title"];    
    }
    

    Aber wenn ich sie aufrufe sort(slice.begin(), slice.end(), title_sort); gibts jede Menge Fehlermeldungen

    In file included from c:\mingw6.2\lib\gcc\mingw32\6.3.0\include\c++\algorithm:62:0,
                     from c:\mingw6.2\lib\gcc\mingw32\6.3.0\include\c++\regex:38,
                     from C:\var\www\vhosts\rolfrost.de\httpdocs\cgi-bin\fw.cpp:18:
    c:\mingw6.2\lib\gcc\mingw32\6.3.0\include\c++\bits\stl_algo.h: In instantiation of 'void std::__sort(_RandomAccessIterator, _RandomAccessIterator, _Compare) [with _RandomAccessIterator = std::_List_iterator<std::map<std::__cxx11::basic_string<char>, std::__cxx11::basic_string<char> > >; _Compare = __gnu_cxx::__ops::_Iter_comp_iter<bool (*)(std::map<std::__cxx11::basic_string<char>, std::__cxx11::basic_string<char> >&, std::map<std::__cxx11::basic_string<char>, std::__cxx11::basic_string<char> >&)>]':
    c:\mingw6.2\lib\gcc\mingw32\6.3.0\include\c++\bits\stl_algo.h:4739:18:   required from 'void std::sort(_RAIter, _RAIter, _Compare) [with _RAIter = std::_List_iterator<std::map<std::__cxx11::basic_string<char>, std::__cxx11::basic_string<char> > >; _Compare = bool (*)(std::map<std::__cxx11::basic_string<char>, std::__cxx11::basic_string<char> >&, std::map<std::__cxx11::basic_string<char>, std::__cxx11::basic_string<char> >&)]'
    C:\var\www\vhosts\rolfrost.de\httpdocs\cgi-bin\fw.cpp:588:48:   required from here
    c:\mingw6.2\lib\gcc\mingw32\6.3.0\include\c++\bits\stl_algo.h:1966:22: error: no match for 'operator-' (operand types are 'std::_List_iterator<std::map<std::__cxx11::basic_string<char>, std::__cxx11::basic_string<char> > >' and 'std::_List_iterator<std::map<std::__cxx11::basic_string<char>, std::__cxx11::basic_string<char> > >')
         std::__lg(__last - __first) * 2,
                   ~~~~~~~^~~~~~~~~
    


  • @_ro_ro sagte in Liste mit maps sortieren:

    ich verstehe nur Bahnhof.

    Du darfst nicht a["title"] < b["title"] schreiben, sondern musst a.at("title") < b.at("title") schreiben.

    Also ich habe jetzt eine dedizierte sort-Funktion

    Edit: Ach, ich hatte gehofft, du hättest schon auf vector statt list umgestellt.



  • Für eine list<...> funktioniert std::sort nicht (anders als @Schlangenmensch geschrieben hat), denn es verlangt einen RandomAccessIterator (also direkten Indexzugriff), daher hat diese eine eigene sort Funktion.



  • @wob sagte in Liste mit maps sortieren:

    ...
    Verwende std::vector statt std::list.
    ...

    @_ro_ro
    Das solltest du wirklich tun.



  • @DocShoe

    ne, da muss ich ja meine ganze Template-Klasse ändern. Aber wenn list schon eine eigene Sortierfunktion hat, muß es doch möglich sein, nach "title" sortieren zu können. In Perl ist das eine einzige Zeile seufz.

    MFG



  • Oooops, kaum macht mans richtig

    bool title_sort(map<string,string>& a, map<string, string>& b){
        return a["title"] > b["title"];    
    }
    void Folder(Response &r){
        list < map<string,string> > slice;
        for( auto li = r.BIN.begin(); li != r.BIN.end(); li++){
            string url = li->first;
            map <string,string> hunt = r.BIN[url];
            if( hunt["parent"].compare(r.URL) == 0 ){
                hunt["url"] = url;
                slice.push_back(hunt);
            }
        }
        slice.sort(title_sort);
        r.LOOPS["children"] = slice; 
    }
    

    Isses das auch? Wenn ich den Vergleichsoperator rumdrehe. wird auch andersherum sortiert.

    MFG



  • @_ro_ro
    In C++ auch:

    slice.sort( []( const map<string,string>& lhs, const map<string, string>& rhs ) { return lhs.at( "title" ) < rhs.at( "title" ); } );
    

    Edit 1
    Waren wir vorhin nicht sogar schon bei const-correctness?

    Edit 2
    @wob ouch, fixed



  • at ist eine Funktion und braucht runde Klammern. Edit: ist oben schon gefixt.



  • @wob

    Ahh, danke!!! Und danke Euch!

    Viele Grüße 😉

    PS: Daß list eine sort-Methode hat war der entscheidende Hinweis!



  • @_ro_ro sagte in Liste mit maps sortieren:

    ne, da muss ich ja meine ganze Template-Klasse ändern.

    slice wird doch nur lokal benutzt, wieso musst du dann alles ändern?

    @_ro_ro sagte in Liste mit maps sortieren:

    Aber wenn list schon eine eigene Sortierfunktion hat, muß es doch möglich sein, nach "title" sortieren zu können. In Perl ist das eine einzige Zeile seufz.

    Du hast dich nun mal entschieden, das in C++ zu machen. Das Gejammere, dass es in <hier beliebige Programmiersprache einsetzen> einfacher, besser oder schneller geht hilft keinem weiter. Wenn es in anderen Programmiersprachen besser, schneller oder einfacher geht, warum machst du dann C++?



  • @DocShoe sagte in Liste mit maps sortieren:

    slice wird doch nur lokal benutzt

    Ja schon. Aber meine Templating::Loop funktioniert nunmal auch nur mit bestimmten Datentypen 😉

    Im Übrigen hat meine Anmerkung mit Jammern nicht das Geringste zu tun.

    MFG



  • @_ro_ro

    Ouch, ja, sehe grad, dass du die in r einsetzt. Du solltest dir trotzdem überlegen, ob du das nicht trotzdem überarbeiten möchtest. std::vector ist der Wald- und Wiesen-Sequence-Container in C++, man sollte schon gute Gründe haben, stattdessen einen anderen Containertyp zu benutzen.



  • @Th69 Argh... std::list gehört zu den Containern, mit denen ich tatsächlich noch nie gearbeitet habe, man sollte halt doch alles einmal in nen Compiler jagen.



  • @_ro_ro sagte in Liste mit maps sortieren:

    Ja schon. Aber meine Templating::Loop funktioniert nunmal auch nur mit bestimmten Datentypen

    1. Du hast dich aus irgendeinem Grund für std::list entschieden. Das ist in 99,9% der Fälle eine schlechte Wahl. Was sprach gegen std::vector?

    2. Wenn du doch nur Iterieren willst, kannst du einfach einen Iterator (ggf. als Template) als Argument nehmen. Dann kannst du in deiner Template-Loop über alles iterieren, was iterierbar ist.



  • @Schlangenmensch

    ein Webframework (kurz Framework, FW) in C++ entwickeln ist Pionierarbeit. Ich frage mich ob das überhaupt schonmal jemand gemacht hat. Entscheidend fürs Gelingen ist in allererster Linie die Idee wie man das ganze umsetzt also die Architektur. Und es ist der ganze Aufbau der nach einer objektorientierten PL förmlich schreit. Dieses FW habe ich nicht an einen Tag entwickelt sondern über mehrere Jahre .
    Erst mit der stückweisen Umsetzung mit Perl wuchs die Idee, dies auch mit anderen PLs zu tun, insbesondere mit der Frage inwieweit man das objektorientiert machen kann. Denn das ganze FW ist objektorientiert aufgebaut.
    Ergo ist der Gedanke, das in C++ zu machen sehr naheliegend. Und das bisherige Ergebnis kann sich sehen lassen aber sowas von.

    MFG



  • @wob sagte in Liste mit maps sortieren:

    1. Du hast dich aus irgendeinem Grund für std::list entschieden. Das ist in 99,9% der Fälle eine schlechte Wahl. Was sprach gegen std::vector?

    Weil das in Perl auch list heißt 😉 Und die Annahme, dass das schon iwie das gleiche sein wird.
    SCNR





  • @Th69 sagte in Liste mit maps sortieren:

    Da gibt es schon so einige:

    s.a. 9 Top Free and Open Source C++ Web Frameworks

    Die sind aber nur in C++. Mein FW jedoch läuft mit Perl mit PHP und mit C++
    und zwar so, daß eine Website Anwendungen bereitstellt die in verschiedenen PLs entwickelt sind. Diese Integration ist für den Anwender transparent.

    MFG


Anmelden zum Antworten