compile time map



  • heyho
    gibt es eine möglichkeit, eine map mit <int, string> so zu schreiben, dass die werte zu compiletime determiniert und eingesetzt (wie literale) werden können? vll sogar mit c++03 ohne constexpr? (c++11 support hab ich nicht)
    mfg



  • Nein, map und string benutzen Heapspeicher, der wird zur Laufzeit zur Verfügung gestellt.



  • manni66 schrieb:

    Nein, map und string benutzen Heapspeicher, der wird zur Laufzeit zur Verfügung gestellt.

    das ist mir auch klar, ich meinte eben ein äquivalent mit c-strings und einer tmp-map. die besagte tmp-map bekomme ich nicht hin. jedenfalls nciht so, dass es keinen runtime-overhead im vergleich zum direkten einsetzen von literalen gibt.



  • Was ist eine tmp-map?



  • zusammengesetztes wort aus tmp und map. den rest kannst dir doch bestimmt denken.



  • Du könntest ein sortiertes Array machen und mit binary search durchsuchen.



  • Vielleicht möchtest du einfach ein Array von Strings, dessen Index das int ist. Der Compiler würde dort auch den Zugriff wegoptimieren wenn der Index eine Konstante ist.



  • tmpler schrieb:

    heyho
    gibt es eine möglichkeit, eine map mit <int, string> so zu schreiben, dass die werte zu compiletime determiniert und eingesetzt (wie literale) werden können? vll sogar mit c++03 ohne constexpr? (c++11 support hab ich nicht)
    mfg

    So etwas?

    #include <stdio.h>
    
    template<int Key> struct ctmap;
    template<> struct ctmap<23> {static char const* get(){return "hello";}};
    template<> struct ctmap<42> {static char const* get(){return "world";}};
    
    int main()
    {
        puts(ctmap<23>::get());
        puts(ctmap<42>::get());
    }
    


  • Wozu braucht man eine Map zur Kompilezeit, wenn die aktuellen Werte sowieso zur Kompilezeit eingesetzt werden? Worauf ich hinaus will: Tut es nicht jede andere Datenstruktur auch?



  • knivil schrieb:

    Wozu braucht man eine Map zur Kompilezeit, wenn die aktuellen Werte sowieso zur Kompilezeit eingesetzt werden? Worauf ich hinaus will: Tut es nicht jede andere Datenstruktur auch?

    Vermutlich tut er suchen eine map, die zur Compilezeit gebaut wird und zur Laufzeit abgefragt werden kann, will nur die Bauzeit sparen.
    Dann soll er über perfekte hashtables nachdenken.



  • ja so in etwa was krümelkacker geschrieben hat, schreibe mir das noch bisschen um, vll kann ich da n interface machen damit man das konfortabler füllen kann.

    der zweck: ja ich sehe es nicht ein, eine std::map mit heap-speicherkosten und konstruktions- /destruktionskosten zu nutzen... (vll ist das aber auch premature optimation, ka)



  • tmpler schrieb:

    vll kann ich da n interface machen damit man das konfortabler füllen kann.

    Makro 🙂

    tmpler schrieb:

    der zweck: ja ich sehe es nicht ein, eine std::map mit heap-speicherkosten und konstruktions- /destruktionskosten zu nutzen... (vll ist das aber auch premature optimation, ka)

    Naja, wenn du mit der Einschränkung klar kommst, dass du da zur Laufzweit nix mehr ändern kannst, geht das ja i.O. Und wenn die Indizes alle zusammenhängend sind, würd ich's einfach mit einer Lookup-Table machen.

    // im header
    extern const char* const mystrings[];
    
    // irgendwo in einer cpp
    extern const char* const mystrings[] = {
       "dies", "das"
    };
    // das extern kann man in der cpp weglassen, wenn man
    // den header inkludiert und damit mystrings schon
    // als extern deklariert hatte
    

    Im Template-Fall sollten sich auch die Strings verstecken lassen. Die statische Funktion kannst du ja bei den Spezialisierungen out-of-line in einer cpp definieren. Habe ich jetzt nicht getestet, müsste aber klappen.



  • tmpler schrieb:

    heyho
    gibt es eine möglichkeit, eine map mit <int, string> so zu schreiben, dass die werte zu compiletime determiniert und eingesetzt (wie literale) werden können? vll sogar mit c++03 ohne constexpr? (c++11 support hab ich nicht)
    mfg

    Guckst du Boost.MPL
    http://www.boost.org/doc/libs/1_54_0/libs/mpl/doc/index.html



  • guckst du gperf


Anmelden zum Antworten