Frage zu einer speziellen Multimap und deren Handhabung



  • Hallo,
    ich habe mal eine Frage zu dem untenstehenden typedef:

    #define ALLOCATOR std::allocator
    typedef std::multimap < int, string, char, ALLOCATOR<std::pair<const int,string> > > myMultimap;
    

    Es sagt doch aus, dass (const) int und string als Paar eingegeben werden müssen, oder? Und (const, int) ist der Key und char der Value, oder?
    Wie füge ich da was in so eine Multimap ein? Der untere Code funktioniert leider nicht. Scheitert an der insert-Methode.

    myMultimap m;
    std::pair <const int, string> key(1, "EinString");
    char value = 'c';
    auto input = std::make_pair(key, value);
    m.insert(input);
    

    Fehlermeldung:

    1. Keine Instanz von Überladene Funktion "std::multimap<_Kty, _Ty, _Pr, _Alloc>::insert [mit _Kty=int, _Ty=std::string, _Pr=char, _Alloc=std::allocator<std::pair<const int, std::string>>]" stimmt mit der Argumentliste überein.
    2. Konvertierung von Argument 1 von "std::pair<std::pair<const int,std::string>,char>" in "std::initializer_list<std::pair<const int,std::string>>" nicht möglich

  • Mod

    Du verstehst die Aufteilung/Assoziierung der verschiedenen Template-Parameter nicht.

    Der erste Parameter ist der (gesamte) Key. Wie soll den multimap sonst wissen, wieviele Parameter dem Key entsprechen?
    Abgesehen davon waere auch der Allocator Parameter falsch. Multimap und auch map speichern die Key/Value Paare in einem einzelnen Knoten ab, der im Interface als pair repraesentiert wird. Demnach ist das zu allozierende Objekt ein pair<pair<int, string>, char>.

    #include <map>
    #include <string>
    #include <iostream>
    
    int main() {
        using namespace std;
        typedef std::multimap <pair<int, string>, char> myMultimap;
        myMultimap m;
        std::pair <const int, string> key(1, "EinString");
        char value = 'c';
        auto input = std::make_pair(key, value);
        m.insert(input);
        cout << m.find(key)->second;
    }
    

    https://coliru.stacked-crooked.com/a/8020a94fd90d268e

    Im Uebrigen ist auch

    #define ALLOCATOR std::allocator
    

    schon vollkommener Quark. Ich kann nur annehmen, dass Du das selber geschrieben hast (da es nicht einmal funktionieren kann)? Vielleicht solltest Du mal den Kontext eroertern.



  • Ok. Vielen Dank!



  • Das mag sein, dass das völliger Quark ist, aber ist nicht auf meinem Mist gewachsen:) Der Code, den ich gepostet habe, habe ich bekommen und ich muss leider damit zurecht kommen.


  • Mod

    @asd1 sagte in Frage zu einer speziellen Multimap und deren Handhabung:

    Das mag sein, dass das völliger Quark ist, aber ist nicht auf meinem Mist gewachsen:) Der Code, den ich gepostet habe, habe ich bekommen und ich muss leider damit zurecht kommen.

    Ich nehme an, das Makro ist so ein Anti-Idiom bei euch in der Firma, und die Multimap hast Du selbst definiert.
    Na dann viel Glueck, aber Du solltest mal nach kompetenteren Kollegen Ausschau halten... 🙂



  • Der Code stammt aus einem öffentlichen github-Repo: https://github.com/quickfix/quickfix/blob/master/src/C++/Utility.h. Zeile 62.



  • @asd1 sagte in Frage zu einer speziellen Multimap und deren Handhabung:

    typedef std::multimap < int, string, char, ALLOCATOR<std::pair<const int,string> > > myMultimap;

    Das stammt aus dem Repo? Wo?


  • Mod

    @hustbaer Ich glaube er meint das Allocator Makro. Wobei blame zeigt, dass dieses schon vor 16 Jahren da rein gepusht wurde.



  • Eh. Das ALLOCATOR ist ja aber auch völlig OK. Doof, aber OK.

    Das Problem ist dass multimap<int, string, char... halt keinen Sinn macht.
    Das wäre ja ne Multimap mit

    • Key = int
    • Value = string
    • Comparator = char

Log in to reply