multimap



  • Hallo
    bei folgendem Kode möchte ich die Werte von m_procedure_map auslesen:

    typedef multimap<string, ProcedureList> ProcedureMap;
    ProcedureMap m_procedure_map;

    m_procedure_map.insert(pair<string, ProcedureList>(name, procedure_list));

    Wie? Vielen Dank
    Michael



  • Wie auslesen? Alle Werte? mit begin() und end() drüber iterieren und Dir eben alles ausgeben. Oder einen bestimmten Wert? Über [] oder find(.) Einträge/Eintrag finden und ausgeben lassen.



  • mike4 schrieb:

    möchte ich die Werte von m_procedure_map auslesen:

    typedef multimap<string, ProcedureList> ProcedureMap;
    ProcedureMap m_procedure_map;

    m_procedure_map.insert(pair<string, ProcedureList>(name, procedure_list));

    Schau mal hier: http://www.cplusplus.com/reference/map/multimap/begin/



  • Ja das habe ich gesehe bekomme aber Fehler:

    for (std::multimap<char,int>::iterator it=m_procedure_map.begin(); it!=m_procedure_map.end(); ++it)
    sprintf(msg, "%d =>%d", (*it).first, (*it).second);

    -------

    ../FMS/IFMSDatabase.cpp:569:69: error: conversion from ‘std::multimap<std::basic_string<char>, std::vector<Procedure*> >::iterator {aka std::_Rb_tree_iterator<std::pair<const std::basic_string<char>, std::vector<Procedure*> > >}’ to non-scalar type ‘std::multimap<char, int>::iterator {aka std::_Rb_tree_iterator<std::pair<const char, int> >}’ requested
    ../FMS/IFMSDatabase.cpp:569:96: error: no match for ‘operator!=’ in ‘it != ((IFMSDatabase*)this)->IFMSDatabase::m_procedure_map.std::multimap<_Key, _Tp, _Compare, _Alloc>::end<std::basic_string<char>, std::vector<Procedure*>, std::less<std::basic_string<char> >, std::allocator<std::pair<const std::basic_string<char>, std::vector<Procedure*> > > >()’

    -------
    Vielen Dank



  • Du hast oben eine map<String, ProcedureList>, willst aber unten über eine map<char, int> iterieren. Aber die Iteratoren willst du unternander mischen?



  • Danke nun noch ein sprintf Fehler:

    e.cpp:571:56: error: cannot pass objects of non-trivially-copyable type ‘const class std::basic_string<char>’ through ‘...’
    se.cpp:571:56: error: cannot pass objects of non-trivially-copyable type ‘class std::vector<Procedure*>’ through ‘...’

    Wie sollte sprintf aussehen, damit ich das nachher als Message ausgeben kann?
    Nochmals vielen Dank



  • Am besten gar kein sprintf sondern nen ostringstream, da sprintf C ist.

    Warum sprintf so nicht geht:
    Du versuchst std::basic_string<char> (std::string) an eine C Funktion zu übergeben, was nicht geht, da die C Funktion den Typ selbstverständlich nicht benutzen kann.

    sprintf(msg, "%s =>%s", it->first.c_str(), it->second.c_str());
    

    mit c++ sähe das so aus:

    std::ostringstream msg;
    msg << it->first << " =>" << it->second;
    // string auslesen mit msg.str()
    

    alle codes untegetestet

    EDIT: Vergiss es, hab übersehen, dass nur das erste bei dir nen String ist. Dann geht die erste Variante erst recht nicht (außer du implementierst c_str(), lass es) und in der zweiten Variante müsstest du operator<< überladen. Was erhoffst du dir denn in der Ausgabe? Wie soll deine Ausgabe später aussehen?



  • Vorerst einfach mal ausgeben:

    const char * inString);

    später weiterverwenden.
    Danke

    PS: .first klappt aber .second nicht weil es ein vector ist.



  • mike4 schrieb:

    PS: .first klappt aber .second nicht weil es ein vector ist.

    Dann musst du dir überlegen was du willst. Du kannst den vector zum Beispiel so ausgeben: "[element1, element2, ...]". Außer die Elemente sind wieder was was cout nicht kennt, dann musst du halt weiter zerlegen.

    ostringstream msg;
    for (auto cit = m_procedure_map.cbegin(); cit != m_procedure_map.cend(); ++cit){
        msg << cit->first << " [";
        for (auto vcit = cit->second.cbegin(); vcit != cit->second.cend(); ++vcit){
            if (vcit != cit->second.cbegin())
                msg << ", ";
            msg << *vcit; //hier muss man je nachdem was im vector steht vielleicht noch was machen
        }
        msg << "]\n";
    }
    
    ...
    //mal eben ausgeben:
    cout << msg.str() << '\n';
    //oder wenn du unbedingt C reinmischen willst
    puts(msg.str().c_str());
    


  • Mit:

    cout << (*it).first << " => " << (*it).second << '\n';

    bekomme ich:

    se.cpp:572:46: error: no match for ‘operator<<’
    ...

    Warum dies?
    Danke



  • Für deine eigenen Typen (ProcedureList) musst du den operator<< natürlich selbst überladen.



  • for (std::multimap<string, ProcedureList>::iterator it=m_procedure_map.begin(); it!=m_procedure_map.end(); ++it)

    XPLMDebugString(reinterpret_cast<char const*>(&it).second);

    mit Fehler:
    error: request for member ‘second’ in ‘(const char*)(& it)’, which is of non-class type ‘const char*’

    oder:
    reinterpret_cast<char const*>(it).second);
    mit fehler:
    error: invalid cast from type ‘std::pair<const std::basic_string<char>, std::vector<Procedure
    > >’ to type ‘const char*’

    Das ist ganz neu für mich. Das ist doch eine Liste von einer Liste mit vectoren?
    Danke für Hilfe zur Ausgabe.
    Gruss



  • reinterpret_cast ist hier sowas von komplett fehl am Platz! Das ist so als würdest du versuchen ne Reifenpanne zu reparieren indem du den Waagen mit ner Tonne TNT in die Luft sprengst.

    Zeig mal den ganzen Ausgabecode den du hast, so bringt das nichts.


Anmelden zum Antworten